XSLT (Extensible Stylesheet Language Transformations)とは、XML文書を別の文書(HTMLやプレーンテキスト、任意のXML文書など)に変換するための言語です。
XSLTスタイルシートをXMLから利用するには、XML文書でXML宣言に続いて、xml-stylesheet処理命令を記述します。
<?xml version="1.0" encoding="Shift_JIS" ?>
<?xml-stylesheet href="www.sample.com/sample.xsl" type="text/xsl" ?>
<book>
<title>我輩は猫である</title>
<author>夏目漱石</author>
</book>
名前空間(ネームスペース)のURIはhttp://www.w3.org/1999/XSL/Transform
である。接頭辞(プリフィクス)は任意に付けられるが、慣習的にxslが使われる。
XSLのルート要素はstylesheetであり、名前空間の接頭辞xslを付けてxsl:stylesheetと表記される。
次にXSLTスタイルシートで使用するXSLエレメントを示します。
xsl:stylesheet は XSL のルート要素です。つまり、開始タグは XML スタイルシートの始まりを表し、終了タグは XML スタイルシートの終わりを表します。
<xsl:stylesheet>
<!-- スタイルシート -->
</xsl:stylesheet>
以下に示す属性を stylesheet 要素に指定できる。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
</xsl:stylesheet>
XSLTエレメント xsl:template は、テンプレートを定義します。
<xsl:template>
<!-- テンプレート -->
</xsl:template>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="version">
<p><xsl:apply-templates/></p>
</xsl:template>
</xsl:stylesheet>
XSLTエレメント xsl:apply-templates は、該当するテンプレートを適用します。
<xsl:apply-templates />
XSLTエレメント xsl:call-template は、指定したテンプレートを呼び出します。
<xsl:call-template />
XSLTエレメント<xsl:variable>は、変数を定義します。
<xsl:variable name="変数名" />
bookという名前のノードの数を数えて、変数number_of_bookに割り当てます。
<xsl:variable name="number_of_book" select="count(//book)"/>
XSLTエレメント<xsl:param>は、変数を定義します。
<xsl:param name="変数名" />
XSLTエレメント<xsl:value-of>は、該当する表現の値を代入します。
<xsl:value-of select="XPath" />
値 | 説明 |
---|---|
no | 特殊文字 & などを & と表現する。 |
yes | 文字はエスケープなしにそのまま表記される。 |
XSLTエレメント<xsl:element>は、エレメントノードを生成します。
<xsl:element name="名前" />
XSLTエレメント<xsl:attribute>は、属性ノードを生成します。
<xsl:attribute name="名前" />
XSLTエレメント<xsl:text>は、テキストを出力します。
<xsl:text disable-output-escaping="...">
<!-- 出力するテキスト -->
</xsl:text>
値 | 意味 |
---|---|
no | 特殊文字 & などを & と表現する。 |
yes | 文字はエスケープなしにそのまま表記される。 |
次に示す例では、<br>
という文字列が出力されます。
<xsl:text><br><xsl:text>
次に示す例では、(HTMLでは)改行が行われます。
<xsl:text disable-output-escaping="yes"><br><xsl:text>
XSLTエレメント<xsl:comment>は、コメントノードを生成します。
<xsl:comment> ... </xsl:comment>
XSLTエレメント<xsl:processing-instruction>は、処理命令(Processing Instruction)を生成します。処理命令とは、<?xml version="1.0" ?> のように <? と ?> ではさまれた特殊なタグのことです。
<xsl:processing-instruction name="名前">
<!-- 処理命令の属性 -->
</xsl:processing-instruction>
<xsl:processing-instruction name="xml-stylesheet">
type="text/css" href="stylesheet.css"
</xsl:processing-instruction>
上記のXSLTスタイルシートは次のタグを生成します。
<?xml-stylesheet type="text/css" href="stylesheet.css"?>
XSLTエレメント<xsl:for-each>は、ループ(繰り返し)処理を行います。
<xsl:for-each"
<!-- 繰り返し処理 -->
</xsl:for-each>
XSLTエレメント<xsl:choose>は、分岐処理を行います。
<xsl:choose>
<xsl:when test="条件1">
<!-- 条件1を満たしたときの処理 -->
</xsl:when>
<xsl:when test="条件2">
<!-- 条件2を満たしたときの処理 -->
</xsl:when>
<xsl:otherwise>
<!-- 上記いずれの条件も満たさなかったときの処理 -->
</xsl:otherwise>
</xsl:choose>
条件を満たしたら、<xsl:when>と</xsl:when>に囲まれた処理を実施します。いずれの条件にも合致しない場合は、<xsl:otherwise>と</xsl:otherwise>に囲まれた処理を実施します。
XSLTエレメント<xsl:if>は、分岐処理を行います。
<xsl:if test="条件">
<!-- 条件を満たしたときの処理 -->
</xsl:if>
XSLTエレメント<xsl:import>は、他のXSLTファイルを読み込みます。
<xsl:import href="URI" />
以下に示す属性を import 要素に指定できる。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="common.xsl"/>
</xsl:stylesheet>
XSLTエレメント<xsl:number>は、指定されたパターンにマッチ(一致)した回数を数えて、その数を出力します(ナンバリング)。
<xsl:number />
数のフォーマット(形式)を指定します。次にformat属性に指定できるフォーマットを示します。
値 | 書式 |
---|---|
1 | 1 2 3 ... 9 10 11 12 ... |
A | A B C ... Z AA AB AC ... |
a | a b c ... z aa ab ac ... |
I | I II III IV V VI ... X XI ... |
i | i ii iii iv v vi ... x xi ... |
あ | あ い う え お か ... |
ア | ア イ ウ エ オ カ ... |
一 | 一 二 三 四 五 ... |
壱 | 壱 弐 参 四 五 ... |
ナンバリングを行うレベルを指定します。
level | 意味 |
---|---|
single | カレントノードのみナンバリングします。親ノードが変われば数はリセットされます。 |
multiple | 親ノードとカレントノードを別々にナンバリングします。出力される数は、1.1 1.2 1.3 2.1 2.2 ... のようになります。 |
any | count属性にマッチ(一致)した順にナンバリングします。親ノードを含めて数は通算されます。 |
次に、level属性に"single"を指定した場合の例を示します。
<?xml version="1.0" encoding="Shift_JIS" ?>
<?xml-stylesheet href="xslnumber.xsl" type="text/xsl" ?>
<book title="詳解UNIXプログラミング">
<chapter title="概論">
<section title="はじめに"/>
<section title="ログイン"/>
<section title="ファイルとディレクトリ"/>
</chapter>
<chapter title="UNIXの標準化と実装">
<section title="はじめに"/>
<section title="UNIXの標準化"/>
</chapter>
</book>
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="book">
<html>
<xsl:for-each select="//chapter//section">
<xsl:number level="single" format="1 " count="chapter|section"/>
<xsl:value-of select="@title"/><br />
</xsl:for-each>
</html>
</xsl:template>
</xsl:stylesheet>
sectionの数を数えて出力しています。親ノードであるchapterが変わると、1から数えなおします。
次に、level属性に"multiple"を指定した場合の出力例を示します。
sectionと親ノードであるchapterをそれぞれ別に数えています。
次に、level属性に"any"を指定した場合の出力例を示します。
sectionと親ノードであるchapterをすべて通算して数えています。
変換結果の出力方法を指定します。
<xsl:output />
値 | 意味 |
---|---|
xml | XML文書 |
html | HTML文書 |
text | プレーンテキスト |
method属性の値 | MIMEタイプ |
---|---|
xml | text/xml |
html | text/html |
text | text/plain |
値 | XML宣言のstandalone属性値 |
---|---|
yes | yes |
no | no |
値 | 意味 |
---|---|
euc-jp | 日本語 EUC |
iso-2022-jp | JISコード |
iso-8859-1 | 西ヨーロッパ言語 ISOコード |
Shift_JIS | シフトJISコード |
UTF-8 | Unicode (UTF-8) |
UTF-16 | Unicode (UTF-16) |
x-euc-jp | 日本語EUC(euc-jpが正式採用される前に仮に使用されていた名前) |
x-sjis | シフトJISコード(Shift_JISが正式採用される前に仮に使用されていた名前) |
XML文書を XSLTスタイルシートでHTML文書に変換した場合、FORMからの送信データは UTF-8 でエンコーディングされます(エンコーディング方法を指定しても無視されます)。POST先(サーブレットやCGI)でエンコーディング方法を UTF-8 以外に指定すると文字化けしてしまいます。
<xsl:output method="html" encoding="Shift_JIS"/>
substringは、文字列を指定した位置から抜き出して、戻り値として返す関数である。
substring(string, start)
substring(string, start, length)
substring関数には、次に示す引数を指定する。
World Wide Web Consortium (2021) XSL Transformations (XSLT) Version 2.0 (Second Edition)