230 likes | 510 Views
XSLT. XML 文書はそのままでは読み易い形で表示されない。 XML 文書を別の XML 文書に変換して、情報抽出や表示をする枠組みが XSLT 。 X ML S tylesheet L anguage T ransformtion 実体の見えにくい XML 文書の可視化、利用の技術として重要。. 参考書. 最近は XML 関連の書籍が多くなり、 XSLT の記述もされているが 実用的なものとしては XSLT+XPath ( ソフトバンク社) 2002 年刊が詳しい。. XSLT の導入.
E N D
XSLT • XML文書はそのままでは読み易い形で表示されない。 • XML文書を別のXML文書に変換して、情報抽出や表示をする枠組みがXSLT。 • XML Stylesheet Language Transformtion • 実体の見えにくいXML文書の可視化、利用の技術として重要。
参考書 • 最近はXML関連の書籍が多くなり、XSLTの記述もされているが • 実用的なものとしては • XSLT+XPath (ソフトバンク社) 2002年刊が詳しい。
以下のようなXML文書をいきなりIE6などのブラウザで表示すると以下のような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/Transform" version="1.0"> <xsl:outputmethod="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-ofselect=“全体/授業/番号”/></TD> <TH>科目名</TH> <TD><xsl:value-ofselect=“全体/授業/科目名” /></TD> </TR> </TABLE> </BODY> </HTML> XML内の要素を取り出し、HTMLのTABLEに変換している。
Template別に書いておいて適用することもできるTemplate別に書いておいて適用することもできる <html>…..<body>…. <xsl:appply-templates select=“全体/授業”/> …. </body></html> 対応する <xsl:template match=“全体/授業”> <xsl:value-of select=“.”/> 全体/授業の内容 </xsl:template> を取り出す
XSLの主な要素 • <xsl:stylesheetxmlns:xsl=“http://www.w3.org/1999/XSL/Transform” version=“1.0”><xsl:outputmethod=“xml” version=“1.0” indent=“yes” />本体 </ xsl:stylesheet> • XSLファイルであることの宣言。XSLの先頭に書く。 • <xsl:outputmethod=“html か xml か text” version=“4.01” encoding=“Shift_JIS” indent=“yes か no" /> • xmlの結果の表示方法の指定
XSLの主な要素 • <xsl:template match=“パターン” name=“テンプレート名”> <xsl:apply-templatesselect=“Xpathの式” > テンプレートの内容 (省略の場合は、指定されたモノ自体) </xsl:allply-templates> </xsl:template> • template は、パターンにマッチする要素の指定 • apply-templates はXpathの式で表されるテンプレートの適用 • </xsl:xxx… /> は<xsl:xxx …></xsl:xxx>の省略 • パターンの例 • A 全てのA要素にマッチ • * 全ての要素にマッチ • A||B 全てのA要素または全てのB要素にマッチ • A/B Aを親とする全てのB要素にマッチ • A//B Aを祖先とする全てのB要素にマッチ • / 文書のルートノードにマッチ
XSLの主な要素 • <xsl:call-template name=“ABC”/> • <xsl:template name=“ABC”> テンプレート本体 </xsl:template> • call-template は ABCという名前で別の場所で定義されたテンプレートの呼び出し
XSLの主な要素( テンプレートの中身になるもの) • <xsl:value-ofselect=“Xpathの式” /> • Xpathの式で指定したノード以下をテキストに変換 • <xsl:copy-ofselect=“ Xpathの式” /> • Xpathの式で指定したノード以下をコピーする • <xsl:copy> テンプレート例えば<xsl:apply-templates /> </xsl:copy> • カレントノードをコピーする • <xsl:element name=“要素名”>- 作成する要素の内容かテンプレート。例えば<xsl:value-ofselect=“a/b” /> </xsl:element> • XMLのファイルの結果ツリー(XMLファイルを表示したとき見えるモノ)に要素名のタグを持つノードを生成する
XSLの主な要素( テンプレートの中身になるもの) • <xsl:comment>この一文はコメントです。</xsl:comment> • コメントの作成(「この一文はコメントです。」) • <xsl:text>テキスト012345</xsl:text> • テキストの作成(「テキスト012345」) • <xsl:numberformat=“01(数字昇順) か a (アルファベット順)など” /> • ノードに番号付けをする。 • 使用例: • <xsl:for-each select=“品名”> <xsl:numberformat="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:sortselect="価格" data-type="number" order="ascending" /> <tr>- <th> <xsl:value-of select="品名" /> </th>- <td> <xsl:value-of select="価格" /> </td> </tr> </xsl:for-each> </table> • xsl:sortselect=“価格”data-type=“number” order=“ascending“は価格要素をキーにして数字の昇順で並べ替える。 • さらにこの例では、その結果をhtmlの表 table として表示
XSLの主な要素:判断、繰り返し制御( テンプレートの中身になるもの) <xsl:variablename=“info” select=“/全体/情報” /> <xsl:template match="/"> <xsl:value-ofselect=“$info/品名” />の販売実績は、 <xsl:value-ofselect=“$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 コンテキストノードの子要素Aを選択 • * コンテキストノードの子要素全部を選択 • text() コンテキストノードの子要素のうちのテキストノードを選択 • @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