XSLT XML文書はそのままでは読み易い形で表示され ない。 XML文書を別のXML文書に変換して、情報抽出 や表示をする枠組みがXSLT。 XML Stylesheet Language Transformtion 実体の見えにくいXML文書の可視化、利用の技 術として重要。 参考書 • 最近はXML関連の書籍が多くなり、XSLT の記述もされているが • 実用的なものとしては • XSLT+XPath (ソフトバンク社) 2002年刊 が詳しい。 XSLTの導入 以下のようなXML文書をいきなりIE6などの ブラウザで表示すると <?xml version="1.0" encoding="Shift_JIS" ?> <全体><授業> <番号>0005</番号> <科目名>数学</科目名> </授業> </全体> しかし、これではうれしくない!! XSLスタイルシートでXML文書 をHTMLに変換する <?xml version="1.0" encoding="Shift_JIS"?> <?xml-stylesheet type="text/xsl" href="ex1a.xsl"?> <全体> <授業> <番号>0005</番号> これが変換の <科目名>数学</科目名> のためのXSL </授業> ファイル </全体> XSLファイルの構造は以下の通り <?xml version="1.0" encoding="Shift_JIS" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transfo rm" version="1.0"> <xsl:output method="html" version="4.01" encoding="Shift_JIS" /> <xsl:template match="/"> 変換の本体部分 文書のルートに </xsl:template> 対してtemplate </xsl:stylesheet> を適用 変換の本体部分(主要部のみ) <HTML LANG="ja"> <BODY> <TABLE BORDER="1"> <TR> <CAPTION>例</CAPTION> <TH>科目番号</TH> <TD> <xsl:value-of select=“全体/授業/番号”/> </TD> <TH>科目名</TH> <TD> <xsl:value-of select=“全体/授業/科目名” /> </TD> </TR> </TABLE> </BODY> </HTML> XML内の要素を取り出し、HTMLのTABLEに変換している。 Template別に書いておいて 適用することもできる <html>…..<body>…. <xsl:appply-templates select=“全体/授業”/> …. </body></html> 対応する <xsl:template match=“全体/授業”> <xsl:value-of select=“.”/> 全体/授業の内容 </xsl:template> を取り出す XSLTの文法の大雑把な詳細 XSLの主な要素 <xsl:stylesheet xmlns:xsl=“http://www.w3.org/1999/XSL/Transform” version=“1.0”> <xsl:output method=“xml” version=“1.0” indent=“yes” /> 本体 </ xsl:stylesheet> XSLファイルであることの宣言。XSLの先頭に書く。 <xsl:output method=“html か xml か text” version=“4.01” encoding=“Shift_JIS” indent=“yes か no" /> xmlの結果の表示方法の指定 XSLの主な要素 • <xsl:template match=“パターン” name=“テンプレート名”> <xsl:apply-templates select=“Xpathの式” > テンプレートの内容 (省略の場合は、指定されたモノ自 体) </xsl:allply-templates> </xsl:template> template は、パターンにマッチする要素の指定 apply-templates はXpathの式で表されるテンプレートの適用 </xsl:xxx… /> は<xsl:xxx …></xsl:xxx>の省略 パターンの例 A * A||B A/B A//B / 全てのA要素にマッチ 全ての要素にマッチ 全てのA要素または全てのB要素にマッチ Aを親とする全てのB要素にマッチ Aを祖先とする全てのB要素にマッチ 文書のルートノードにマッチ XSLの主な要素 • <xsl:call-template name=“ABC”/> • <xsl:template name=“ABC”> テンプレート本体 </xsl:template> call-template は ABCという名前で別の場 所で定義されたテンプレートの呼び出し XSLの主な要素 ( テンプレートの中身になるもの) • <xsl:value-of select=“Xpathの式” /> – Xpathの式で指定したノード以下をテキストに変換 • <xsl:copy-of select=“ Xpathの式” /> – Xpathの式で指定したノード以下をコピーする • <xsl:copy> テンプレート例えば <xsl:apply-templates /> </xsl:copy> – カレントノードをコピーする • <xsl:element name=“要素名”>作成する要素の内容かテンプレート。例えば<xsl:value-of select=“a/b” /> </xsl:element> – XMLのファイルの結果ツリー(XMLファイルを表示したとき見えるモノ)に要素 名のタグを持つノードを生成する XSLの主な要素 ( テンプレートの中身になるもの) • <xsl:comment>この一文はコメントです。</xsl:comment> – コメントの作成(「この一文はコメントです。」) • <xsl:text>テキスト012345</xsl:text> – テキストの作成(「テキスト012345」) • <xsl:number format=“01(数字昇順) か a (アルファベット 順)など” /> – ノードに番号付けをする。 – 使用例: • <xsl:for-each select=“品名”> <xsl:number format="01" /> <xsl:apply-templates /> </xsl:for-each> XSLの主な要素:判断、繰り返し制御 ( テンプレートの中身になるもの) • <xsl:if test=“条件式 例えば(価格>1000)”>条件式は成立する場合に実行するテンプレート </xsl:if> • <xsl:for-each select=“Xpathの式”> Xpathの式のすぐ内側のノードに繰り返し適用するテンプ レート </xsl:for-each> • <xsl:choose><xsl:when test=“条件式”>条件式が成立した場合に実行するテンプレート </xsl:when><xsl:when test=“別の条件式”>別の条件式が成立した場合に実行するテンプレート </xsl:when><xsl:otherwise> 上の条件式が全部成立しなかった場合に実行するテンプレート </xsl:otherwise> </xsl:choose> XSLの主な要素:判断、繰り返し制御 ( テンプレートの中身になるもの) <table border=“1”><xsl:for-each select=“情報”> <xsl:sort select="価格" data-type="number" order="ascending" /> <tr>- <th> <xsl:value-of select="品名" /> </th><td> <xsl:value-of select="価格" /> </td> </tr> </xsl:for-each> </table> – xsl:sort select=“価格” data-type=“number” order=“ascending“ は価格要 素をキーにして数字の昇順で並べ替える。 – さらにこの例では、その結果をhtmlの表 table として表示 XSLの主な要素:判断、繰り返し制御 ( テンプレートの中身になるもの) <xsl:variable name=“info” select=“/全体/情報” /> <xsl:template match="/"> <xsl:value-of select=“$info/品名” /> の販売実績は、 <xsl:value-of select=“$info/価格*$info/販売数*1.05” /> 円 です。 </xsl:template> 変数$infoを導入して繰り返しの記述を簡略化している例 Xpathの式 XML文書のある部分を指定するための言語が Xpath 現在地(カレントノード)から目的地までの経路(Xpathの 式)を一般に a/b/c という形で書く。 経路をたどる途中での点をコンテキストノードという。 a/b で<b>までくると<b>がコンテキストノード。そこから /c という経路をたどると目的地まで行く。 <root> <a> <b> <c>x</c> </c> </a> 経路 (Xpathの式)の表現方法 / A * text() @A 文書のルートノード コンテキストノードの子要素Aを選択 コンテキストノードの子要素全部を選択 コンテキストノードの子要素のうちのテキストノードを選択 コンテキストノードの属性Aを選択 <tag A=“10”> だと tagがタグ名、Aが属性、10が値 @* コンテキストノードの属性の全てを選択 A[1] コンテキストノードの最初の子要素Aを選択 A[last] コンテキストノードの最後の子要素Aを選択 //A 文書のルートのAというノードを全て選択 . (ピリオド) コンテキストノードを選択 .. (ピリオド2個) コンテキストノードの親を選択 a<b> 1個以上の<b>要素を持つコンテキストノードの<a>子要素を 選択 A[@B1 and @B2] B1属性とB2属性を持つコンテキストノードの子要素 Aの全てを選択 演算子:条件式を作るために使う • • • • • or and = , != < > , <= >= > < , >= <= Xpath関数(Xpathの式として使う) • position() ノードの位置を数値で返す – <xsl:if test=“position()=2”> – <xsl:apply-template /> • last() ノード数を返す – <xsl:if test=“position()=last()” /> • count(ノード集合) – count(A/B) <A>の子孫にあるノード全部の中の <B>の要素数 • local-name() カレントノードのローカル名 – <xsl:value-of-select=“local-name() /> – <xsl:abc> abc がローカル名 – name()はブローバル名 xsl:abc を返す Xpath関数 • string(A) ノードAを文字列にする – 非数値は NaN, – <xsl:if test=“string(number(価格))=‘NaN’”> • number(A) Aを数値にする • concat(文字列1,文字列2,…) 連結された 文字列 • substring(“abcdef”,2,3) “bcd” 部分文字 列 • string-length(“abc”) 3 Xpath関数 • translate(123121,’123’,’abc’) abcaba • sum(ノード集合) ノードの文字列値を数 値に変換して総和 – <root><a>12</a> <a>23</a></root> – <xsl:value-of select=“sum(<root>)) /> 35
© Copyright 2024 ExpyDoc