xsl:when

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
= , !=
< &gt , <= &gt=
> &lt , >= &lt=
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