XSLT2.0

XSLT 2.0で便利になった機能(59) ロケーションステップでの式記述

今まで知らなかったといえばそれまでなのですが、掲題の機能は非常に便利です.一般的にソースドキュメントからなにがしかの値を求める場合、ロケーションステップを使用します.例えば /doc/chapter/sect/p など.でもこれを求めるときに入力ドキュメントに…

XSLT 2.0で便利になった機能(58) キャラクタマップ(2)

キャラクタマップ(xsl:character-map)についてはすでに以前書きましたのでダブルポストです.xsl:character-mapは、XSLTスタイルシートで入力XMLを出力XMLに変換し、それを実際のファイルに書き出す(シリアライズ)するときに、自動的に「指定した文字」…

XSLT2.0で便利になった機能(57) Xpathのコメント

XSLTというよりは、XPathの話なのですが、この前DITA-OTのxslフォルダのスタイルシートを見ていたら次のようなコードが出てきました. <xsl:if test="(:not(@linking) and :)not($parent-linking='none')"> あまり見慣れていない"(:"と":)"という表記があります.これは何かというと実はXPathの中に書けるコメントです. エッ!</xsl:if>…

XSLT2.0で便利になった機能(56) xsl:analyze-string

すでに取り上げていますが、xsl:analyze-stringをもう一度使ってみる機会がありましたので紹介します. 目的は"($Index_Indent_Value) * %level + 2mm"のようなスタイル記述の文字列で、"$"で始まっている変数的なものを取り出して値で置換する、他はそのま…

XSLT2.0で便利になった機能(55) replace

replaceというのはXPath 2.0から使用できるようになった実に強力な関数です. 7.6.3 fn:replace http://www.w3.org/TR/xpath-functions/#func-replace 何が強力かというとそれは正規表現が使えてしまうからです.関数の定義は fn:replace( $input as xs:stri…

XSLT2.0で便利になった機能(54) xsl:perform-sort

文書系のスタイルシートを作っていると、なかなかxsl:sortにお目にかかる機会がありません.せいぜいあるとすれば<indexterm>をABC順(日本語ならあいうえお順)にソートするときくらいでしょうか?今回たまたまxsl:sortを使う機会がありました.どのような場合かという</indexterm>…

XSLT2.0で便利になった機能(53) use-when属性

今まで10年以上XSLT1.0で動かしてきたシステムが、Word2003のサポート終了でWord2013へ移行することになりました.Word2003の出力するWordMLを使用してきたのですが、同じWordMLでもWord2013の吐き出すWordMLは相当毛色が違います. 実際にWord2013の出したW…

XSLT2.0で便利になった機能(52) xsl:param/@as属性

もう前に一回書いている気もしますが、XSLT2.0ではxsl:paramで関数やテンプレートにパラメータを記述するときに、as属性でパラメータの型を記述することができます. <xsl:param name="prmMax" as="xsl:integer" required="yes"/> <xsl:param name="prmInputStr" as="xsl:string" required="yes"/> ※ required="yes"が書けるのはxsl:templateの場合のみです.xsl:functionでは元々必須で</xsl:param></xsl:param>…

XSLT2.0で便利になった機能(52) xsl:template(続き)

テンプレートから複数の種類のitem()から成るシーケンスを返す例を紹介します.例えば次のような要望があったと考えます. ① section/divという要素構造がある.sectionはdivから構成され、divがテキストを持つ. ② divの文字数が一定数以上のものを抽出した…

XSLT2.0で便利になった機能(51) xsl:template

いまさらですが、xsl:templateについて考え直してみました.XSLT2.0でテンプレートはどのように変わったのでしょうか?これは仕様でどのようにテンプレートが定義されているかを見ればわかります. [XSLT1.0] <xsl:template match = pattern name = qname priority = number mode = qname> </xsl:template> 5.3 Defining Templa…

XSLT 2.0で便利になった機能(50) every式をつかう.(その2)

以前every式を使う例を紹介しましたが、今回もう少し効果的なところで使用する例がありましたので紹介します.以下のXMLをご覧ください. <section> <div group="フルーツ" id="idりんご"> <span>りんご</span> </div> <div group="フルーツ" id="idみかん"> <span>みかん</span> </div> <div group="フルーツ" id="idバナナ"> <span>バナナ</span> </div> </section>

XSLT 2.0で便利になった機能(49) node()*とdocument-node() (その2)

先だって <div> <span>りんご</span> <span>みかん</span> <span>バナナ</span> </div> と書いて <xsl:variable name="div_seq" as="node()*"> <xsl:sequence select="/div/span[1]"/> <xsl:sequence select="/div/span[2]"/> <xsl:sequence select="/div/span[3]"/> </xsl:variable> と書くと、node()*に…

XSLT 2.0で便利になった機能(48) node()*とdocument-node()

XSLT2.0でシーケンスが導入されて大変便利になりました.変数をxs:integer*、xs:string+などと定義できるとプログラミングの自由度が格段に向上します.さてそれではnode()*はどうでしょうか?これもまた便利なのですが、document-node()とどう違うのか?た…

XSLT 2.0で便利になった機能(47) xsl:value-ofのseparator属性

この前、次のようなデータから <div> <span>りんご</span> <span>みかん</span> <span>バナナ</span> </div> 次のような出力を得るのにposition()関数を使う例を紹介しました. <fo:block>【りんご,みかん,バナナ】</fo:block> もしspan以下に<i>や<b>などの要素がないか、あっても無視できる場合、もっと簡単にできます.それは<xsl:value-of>を使用す</xsl:value-of></b></i>…

XSLT 2.0で便利になった機能(46) xsl:templateのmatch属性

テンプレートとmatch属性はXSLTスタイルシートの核をなす構成要素です.match属性の中身はパターン(pattern)と呼ばれます.ここには一般的にはパスのパターンを書きます.例えば <xsl:template match="p"> はp要素にマッチした処理を記述します. <xsl:template match="p[string(@outputclass) eq 'normal']"> はouputclass属性が"normal"のp要</xsl:template></xsl:template>…

XSLT 2.0で便利になった機能(45) xsl:with-param

これは便利になった機能というよりはむしろ失敗談なのですが、せっかく良い教訓を得たので紹介します. それが起こったのは、次の日がスタイルシートの何回目かの中間リリースという夜でした.それまでばっちり動いていたスタイルシートに、何箇所かの「ちょ…

XSLT 2.0で便利になった機能(44) requied属性

今までxsl:templateのxsl:paramには必ず、@requiredと@asをつけるのを常としてきました.でもスタイルシートレベルのxsl:paramはあまりよくわかっていなかったのでこれらをつけることはありませんでした.この前EPUBを作るときに、antのbuild.xmlで次のよう…

XSLT 2.0で便利になった機能(43) xsl:next-match

目からうろこという言葉がありますが、このxsl:next-matchはまさにそれでした. 今日お客様の仕事でDITAのスタイルシートのカスタマイズをしていました.お客様からのリクエストは、task/taskbody/stepsが出現したら、そこに「TASK」と表示して欲しいという…

XSLT 2.0で便利になった機能(42) mode属性

特に文書系なのですが、スタイルシートは手が込んでくるとやたらとモードを使って処理を切り回す場合があります.相手は同じ要素なのですが、xsl:templateのmode属性を変えて違った処理をしたいことが多々ある訳です.索引などがよい例かもしれません.私はX…

XSLT 2.0で便利になった機能(41) treat as演算子

今回はtreat as演算子を紹介します.treat as演算子はちょっと難しい概念の中で定義されています.それは、XPathの式の処理系のインプリメントに関係しています. XPathの式処理は、勧告によれば「static analysis phase」と「dynamic evaluation phase」の…

XSLT 2.0で便利になった機能(40) instance of演算子

今回はinstance of演算子を紹介します.instance of演算子は、例えば組み込み型で使ってみると以下のようになります. 5 instance of xs:integer は true を返します. 5 instance of xs:positiveInteger は false を返します(!). "5" instance of xs:int…

XSLT 2.0で便利になった機能(39) &quot;,&quot;演算子

今回は","演算子を紹介します.","演算子は両辺のアイテムかシーケンスを結合して新たにシーケンスを作成してくれます.今までの例の中では、 <xsl:variable name="dayOfWeek" select="'Sunday','Monday','Tuesday','Wednesday',Thurseday','Friday','Saturday'" as="xs:string*"/> <xsl:if test="$day = $dayOfWeek"> ... <xsl:if> というような形で","演算子でシーケンスを作って利用してきました.また、実務上では私はもっぱらxsl:mes…</xsl:if></xsl:if></xsl:variable>

XSLT 2.0で便利になった機能(38) union、intersect、except演算子

今回は、union、intersect、except演算子について紹介します.これらの演算子はnode()*をオペランドとして使用します.この3つの中で、XSLT1.0では、union演算子がサポートされていました.実はunionと"|"は同じです.例えばXSLT1.0では <xsl:apply-templates select="frontmatter | chapter | part | appendix | backmatter"/> というように使用</xsl:apply-templates>…

閑話休題: 比較演算子(2)

前回比較演算子のことについて書きましたが、まだ例はAtomic valueとシーケンスの比較でした.シーケンス同士の比較になると、知っておいた方が良いことがあります.(実際のスタイルシートで問題になるということはほとんどないと思いますが...) ■ "="も"!…

閑話休題: 比較演算子

スタイルシートでは必ず比較演算子を使用すると思いますが、みなさんはどの比較演算子をお使いでしょうか? 一般比較演算子: "=", "!=", ">", "<", "<=", ">=" 値比較演算子 : "eq", "ne", "gt", "lt", "le", "ge" XSLT1.0からXSLT2.0へスタイルシートを移行…

XSLT 2.0で便利になった機能(37) 数値型、演算子

XSLTといってもいわゆる「文書型」のXMLを変換するのと、「データ型」のXMLを変換するのとでは事情が変わります.私はもっぱら「文書型」のXMLの方しかやっていないので、数値型の詳細や演算子に触れる機会がなかったのですが、見る機会がありましたので紹介…

XSLT 2.0で便利になった機能(36) &quot;&gt;&gt;&quot;演算子

まず使うことはないと思っていた">>"演算子ですがたまたま使う機会がありましたので紹介します. 少し話がややこしいのですが、DITAを使っているお客さんがいます.<ol>の出力要求仕様があって、<ol>の入れ子レベルによって、1. 2. 3. と a. b. c. と i. ii. iii.と</ol></ol>…

XSLT 2.0で便利になった機能(35) コンテキストアイテム

コンテキストアイテムについての話です.どちらかといえば便利になったというよりは、拡張と制約の話ですが. コンテキストアイテムは"."で表されます.XSLT1.0を使っておられる方でしたら、"."は何かと問われれば間違いなくカレントノードと答えるでしょう…

XSLT 2.0で便利になった機能(34) デフォルトネームスペース

いまやXMLはどこもかしこも(?)XMLはネームスペースの世界です.あのDocBookもネームスペースが導入されています.DocBookのインスタンスを作成するとき、たぶん次のようにデフォルトネームスペースとして"http://docbook.org/ns/docbook"を指定するでしょ…

XSLT 2.0で便利になった機能(33) 文字列中の&quot;&#039;&quot;

ベーシックな文字列のの話です.どちらかといえばXSLT2.0というより、XPath2.0の範疇ですが. 私の作っているXSLT1.0のスタイルシートですが、お客さんのところでLinuxサーバーとスタンドアロンのWindowsの両方で使っていただいています.Linuxサーバーの方…