2008-07-16 (Wed)
ゆの in XSLT 2.0
コード
<?xml version="1.0" encoding="utf-8"?> <!--バージョン宣言と「xs」および「ひだまり」の名前空間宣言--> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ひだまり="http://d.hatena.ne.jp/keyword/%A4%E6%A4%CE%20in%20language"> <!--独自要素 *1--> <ひだまり:スケッチ version="×365"> X / _ / X < 来週も見てくださいね! </ひだまり:スケッチ> <!--グローバル変数(引数)--> <xsl:param name="ひだまり:filepath" select="'file:/C://hoge/x365.txt'" as="xs:string"/> <!--エントリポイント--> <xsl:template match="/"> <!--最終出力--> <xsl:result-document href="{$ひだまり:filepath}"> <xsl:value-of select="ひだまり:unYunoize(document('')/*/ひだまり:スケッチ[position() = 1])"/> </xsl:result-document> </xsl:template> <!--独自関数--> <xsl:function name="ひだまり:unYunoize" as="xs:string"> <!--引数--> <xsl:param name="yuno" as="element()"/> <!--内容--> <xsl:variable name="result"> <xsl:analyze-string select="$yuno/child::text()" regex="(.*)<(.*)"> <xsl:matching-substring> <!--マッチした regex-group(1) の値 'X / _ / X ' を取得し、 tokenize 関数により xs:string+ 型のノード集合 ('X', '/', '_', '/', 'X') にし、 for-each ループにかける。--> <!--(この辺りのプロセスに特に意味はない。無理やり紹介したかっただけ。)--> <xsl:for-each select="tokenize(regex-group(1), ' ')"> <xsl:value-of select=" if (position() = 3) then replace(name($yuno), ':', '') else ''"/> </xsl:for-each> <xsl:value-of select="$yuno/@version"/> <xsl:value-of select="regex-group(2)"/> </xsl:matching-substring> </xsl:analyze-string> </xsl:variable> <!--返り値--> <xsl:sequence select="$result"/> </xsl:function> </xsl:stylesheet>
処理前
このスタイルシートをデフォルトスタイルシートを適用させないブラウザ (例えば Opera) で開くと「1」のテキストノードだけが実体参照も展開され表示されます:
X / _ / X < 来週も見てくださいね!
要素名とするのも XPath 式とするのも先にやられたので苦肉の策として、ね。。いや、でもこれは実に「XML らしい」と思うんだ!
処理後
処理系に Saxon を使うなら、以下のようなコマンドを実行します:
java -jar saxon -s:yuno-in-xslt20.xsl -xsl:yuno-in-xslt20.xsl
結果 ('file:/C://hoge/x365.txt'):
ひだまりスケッチ×365 来週も見てくださいね![EOF]
ポイント
- XML らしく(コード中にそのままリテラルを書けるのは多くの他言語にない)
- XSLT の自称中級者的な使い方
- XSLT 2.0 らしく(1.0 じゃないからこそできることを紹介しておいた)
- xsl:result-document 要素の追加により最終出力の多様化・明確化が可能に。
- xsl:function 要素の追加により独自関数の定義が可能に。
- ただただ素晴らしい。
- as 属性による型付けで返り値の明確化が可能に。xs:QName* や element()? などとすれば個数を指定できる。
- xsl:analyze-string 要素および regex 系の XPath 2.0 関数により文字列処理能力が飛躍的に向上。
- fn:translate(笑)
- XPath 式内での条件分岐 (if-then-else)
- キモイけど便利
- xsl:sequence 要素によりシーケンスコンストラクタ返り値の明確化が可能に。
- コードが読み易くなった。
- XSLT 1.0 における「結果ツリーフラグメント (Result Tree Fragment)」すらも別の内容生成にかけられるようになった。
- 激しく融通が利くようになった。
名無し2008/07/17 11:11すばらしい!
ジャンボ2008/09/30 00:36operaのバージョン9.27で試してみましたがswfは表示できませんでしたぁ。。
藁にもすがり2009/05/20 17:25FireFox3.0.10でもFlashは表示されませんでした orz
りらぞう2011/06/17 14:19クロームVer12確認表示できましたですよ
Infinity2012/01/11 13:44Thanks alot - your anewsr solved all my problems after several days struggling
dluhwunuzb2012/01/11 21:40wyax3G <a href="http://vjzmsybnjjbf.com/">vjzmsybnjjbf</a>
xbirqqfyns2012/01/12 20:01BMrxuq , [url=http://ugihygktodgz.com/]ugihygktodgz[/url], [link=http://owreulnczbeq.com/]owreulnczbeq[/link], http://kzjwktlnnhgs.com/
plfqblj2012/01/14 18:46YUBOVh <a href="http://uiswoeubkwfh.com/">uiswoeubkwfh</a>
gsrgemf2012/01/16 04:025im20u , [url=http://drdmwrrhcamy.com/]drdmwrrhcamy[/url], [link=http://jprpaxbonxlr.com/]jprpaxbonxlr[/link], http://fsqceztflkmu.com/