XSLTスタイルシート

XSLT (Extensible Stylesheet Language Transformations)とは、XML文書を別の文書(HTMLやプレーンテキスト、任意のXML文書など)に変換するための言語です。

Extensible Stylesheet Language Transformation
Figure 1. XSLT

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>

XSLエレメント

名前空間(ネームスペース)のURIはhttp://www.w3.org/1999/XSL/Transformである。接頭辞(プリフィクス)は任意に付けられるが、慣習的にxslが使われる。

XSLのルート要素はstylesheetであり、名前空間の接頭辞xslを付けてxsl:stylesheetと表記される。

次にXSLTスタイルシートで使用するXSLエレメントを示します。

xsl:stylesheet

xsl:stylesheet は XSL のルート要素です。つまり、開始タグは XML スタイルシートの始まりを表し、終了タグは XML スタイルシートの終わりを表します。

書式

<xsl:stylesheet>
  <!-- スタイルシート -->
</xsl:stylesheet>

属性

以下に示す属性を stylesheet 要素に指定できる。

version
XSL Transformations (XSLT) のバージョンを指定する。必須属性であり、省略できない。
xmlns
XSL Transformations (XSLT) の名前空間を指定する。任意の接頭辞を付けることができるが、慣習的に xsl にすることが多い。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
</xsl:stylesheet>

xsl:template

XSLTエレメント xsl:template は、テンプレートを定義します。

書式

<xsl:template>
  <!-- テンプレート -->
</xsl:template>

属性

match
テンプレートを適用するノードをXPath表現で指定します。 xsl:apply-templatesエレメントでselect属性が省略された場合に、 出現したノードとこのmatch属性が一致すればこのテンプレートが適用されます。
name
テンプレートの名前を指定します。テンプレートの名前は、xsl:call-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>

xsl:apply-templates

XSLTエレメント xsl:apply-templates は、該当するテンプレートを適用します。

書式

<xsl:apply-templates />

属性

select
省略可能。テンプレートを適用させるノードをXPath表現で指定します。 select属性に指定したノードが出現した場合、そのノードに対応したテンプレートを適用します。 select属性を省略した場合、各ノードに対応したテンプレートを適用します。 つまり、出現したノードがxsl:templateエレメントのmatch属性に一致すれば、そのテンプレートを適用します。
mode
省略可能。同じ要素に対する処理方法が複数定義されているときに、それらの中で区別するための名前を指定します。

xsl:call-template

XSLTエレメント xsl:call-template は、指定したテンプレートを呼び出します。

書式

<xsl:call-template />

属性

name
テンプレートの名前を指定します。 テンプレートの名前とは、xsl:templateエレメントのname属性に指定した名前です。

xsl:variable

XSLTエレメント<xsl:variable>は、変数を定義します。

書式

<xsl:variable name="変数名" />

属性

name
変数の名前を指定します(必須)。
select
表現の内容が変数に割り当てられます。

bookという名前のノードの数を数えて、変数number_of_bookに割り当てます。

<xsl:variable name="number_of_book" select="count(//book)"/>

xsl:param

XSLTエレメント<xsl:param>は、変数を定義します。

書式

<xsl:param name="変数名" />

属性

name
変数の名前を指定します(必須)。
select
表現の内容が変数に割り当てられます。

xsl:value-of

XSLTエレメント<xsl:value-of>は、該当する表現の値を代入します。

書式

<xsl:value-of select="XPath" />

属性

select
XPath表現で出力する内容を指定します。select属性は必須で、省略できません。
disable-output-escaping
特殊文字を実体参照で表記するか否かを指定します。
disable-output-escaping
説明
no特殊文字 & などを &amp; と表現する。
yes文字はエスケープなしにそのまま表記される。

xsl:element

XSLTエレメント<xsl:element>は、エレメントノードを生成します。

書式

<xsl:element name="名前" />

属性

name
エレメントノードの名前を指定します(必須)。

xsl:attribute

XSLTエレメント<xsl:attribute>は、属性ノードを生成します。

書式

<xsl:attribute name="名前" />

属性

name
属性ノードの名前を指定します(必須)。

xsl:text

XSLTエレメント<xsl:text>は、テキストを出力します。

書式

<xsl:text disable-output-escaping="...">
  <!-- 出力するテキスト -->
</xsl:text>

属性

disable-output-escaping
特殊文字を実体参照で表記するか否かを指定します。
disable-output-escaping
意味
no特殊文字 & などを &amp; と表現する。
yes文字はエスケープなしにそのまま表記される。

次に示す例では、<br> という文字列が出力されます。

<xsl:text>&lt;br&gt;<xsl:text>

次に示す例では、(HTMLでは)改行が行われます。

<xsl:text disable-output-escaping="yes">&lt;br&gt;<xsl:text>

xsl:comment

XSLTエレメント<xsl:comment>は、コメントノードを生成します。

書式

<xsl:comment> ... </xsl:comment>

xsl:processing-instruction

XSLTエレメント<xsl:processing-instruction>は、処理命令(Processing Instruction)を生成します。処理命令とは、<?xml version="1.0" ?> のように <? と ?> ではさまれた特殊なタグのことです。

書式

<xsl:processing-instruction name="名前">
  <!-- 処理命令の属性 -->
</xsl:processing-instruction>

属性

name
処理命令の名前を指定します。必須属性です。

使用例

<xsl:processing-instruction name="xml-stylesheet">
  type="text/css" href="stylesheet.css"
</xsl:processing-instruction>

上記のXSLTスタイルシートは次のタグを生成します。

<?xml-stylesheet type="text/css" href="stylesheet.css"?>

xsl:for-each

XSLTエレメント<xsl:for-each>は、ループ(繰り返し)処理を行います。

書式

<xsl:for-each"
  <!-- 繰り返し処理 -->
</xsl:for-each>

属性

select
繰り返し処理を適用するノードをXPath表現で指定します。 select属性で指定したノードが現れるたびに<xsl:for-each>と</xsl:for-each>で挟まれた処理を行います。

xsl:choose

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>に囲まれた処理を実施します。

属性

test
条件を指定します。

xsl:if

XSLTエレメント<xsl:if>は、分岐処理を行います。

書式

<xsl:if test="条件">
 <!-- 条件を満たしたときの処理 -->
</xsl:if>

属性

test
条件を指定します。この条件を満たしたら、<xsl:if>と</xsl:if>に囲まれた処理を実施します。

xsl:import

XSLTエレメント<xsl:import>は、他のXSLTファイルを読み込みます。

書式

<xsl:import href="URI" />

属性

以下に示す属性を import 要素に指定できる。

href
読み込むXSLTファイルのURIを指定する。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:import href="common.xsl"/>
</xsl:stylesheet>

xsl:number

XSLTエレメント<xsl:number>は、指定されたパターンにマッチ(一致)した回数を数えて、その数を出力します(ナンバリング)。

書式

<xsl:number />

属性

count
数えるパターンをXPath表現で指定します。
format

数のフォーマット(形式)を指定します。次にformat属性に指定できるフォーマットを示します。

format属性の値
書式
11 2 3 ... 9 10 11 12 ...
AA B C ... Z AA AB AC ...
aa b c ... z aa ab ac ...
II II III IV V VI ... X XI ...
ii ii iii iv v vi ... x xi ...
あ い う え お か ...
ア イ ウ エ オ カ ...
一 二 三 四 五 ...
壱 弐 参 四 五 ...
from
数をリセットするときのパターンをXPath表現で指定します。
level

ナンバリングを行うレベルを指定します。

level
level意味
singleカレントノードのみナンバリングします。親ノードが変われば数はリセットされます。
multiple親ノードとカレントノードを別々にナンバリングします。出力される数は、1.1 1.2 1.3 2.1 2.2 ... のようになります。
anycount属性にマッチ(一致)した順にナンバリングします。親ノードを含めて数は通算されます。

次に、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>
1 はじめに
2 ログイン
3 ファイルとディレクトリ
1 はじめに
2 UNIXの標準化

sectionの数を数えて出力しています。親ノードであるchapterが変わると、1から数えなおします。

次に、level属性に"multiple"を指定した場合の出力例を示します。

1.1 はじめに
1.2 ログイン
1.3 ファイルとディレクトリ
2.1 はじめに
2.2 UNIXの標準化

sectionと親ノードであるchapterをそれぞれ別に数えています。

次に、level属性に"any"を指定した場合の出力例を示します。

2 はじめに
3 ログイン
4 ファイルとディレクトリ
6 はじめに
7 UNIXの標準化

sectionと親ノードであるchapterをすべて通算して数えています。

xsl:output

変換結果の出力方法を指定します。

書式

<xsl:output />

属性

method
出力方法を指定します。次に代表的な値を示します。
意味
xmlXML文書
htmlHTML文書
textプレーンテキスト
cdata-section-elements
子ノードとしてのテキストノードをCDATAセクションとして出力したい場合、その要素名を指定します。そのような要素が複数ある場合には、要素名を空白で区切って記述します。method 属性に "xml" を指定した場合のみ意味を持ちます。cdata-section-elements属性は省略可能です。
doctype-public
DOCTYPE宣言のpublic内容を指定します。doctype-public属性は省略可能です。
doctype-system
DOCTYPE宣言のsystem内容を指定します。doctype-system属性は省略可能です。
media-type
MIMEタイプを指定します。media-type 属性は省略可能です。省略した時の値は method 属性値によって決まります。
MIMEタイプ
method属性の値MIMEタイプ
xmltext/xml
htmltext/html
texttext/plain
indent
"yes" を指定すると、出力結果ファイルにインデントのための適用な空白が挿入されます。どのように空白が挿入されるかはXSLTプロセッサ次第です。indent属性を省略したときや "no" を指定したときは、インデントのための空白は挿入されません。indent属性は省略可能です。
omit-xml-declaration
"yes" を指定するとXML宣言を出力しません。"no" を指定したときはXML宣言を出力します。method 属性に "xml" を指定した場合のみ意味を持ちます。omit-xml-declaration属性は省略可能です。
standalone
XML宣言のstandalone属性の値を指定します。method 属性に "xml" を指定した場合のみ意味を持ちます。standalone属性は省略可能です。
XML宣言のstandalone属性値
yesyes
nono
encoding
エンコーディング(文字セット)を指定します。encoding属性は省略可能です。
encoding
意味
euc-jp日本語 EUC
iso-2022-jpJISコード
iso-8859-1西ヨーロッパ言語 ISOコード
Shift_JIS シフトJISコード
UTF-8Unicode (UTF-8)
UTF-16Unicode (UTF-16)
x-euc-jp 日本語EUC(euc-jpが正式採用される前に仮に使用されていた名前)
x-sjisシフトJISコード(Shift_JISが正式採用される前に仮に使用されていた名前)

XML文書を XSLTスタイルシートでHTML文書に変換した場合、FORMからの送信データは UTF-8 でエンコーディングされます(エンコーディング方法を指定しても無視されます)。POST先(サーブレットやCGI)でエンコーディング方法を UTF-8 以外に指定すると文字化けしてしまいます。

version
method属性に"xml"を指定した場合はXMLのバージョン、"html"を指定した場合はHTMLのバージョンを指定します。version属性は省略可能です。

使用例

<xsl:output method="html" encoding="Shift_JIS"/>

substring

substringは、文字列を指定した位置から抜き出して、戻り値として返す関数である。

substring(string, start)
substring(string, start, length)

substring関数には、次に示す引数を指定する。

string
元の文字列
start
文字を抜き出す開始位置
length
文字列を抜き出す文字数の最大値を指定する。この引数を省略した場合は、抜き出す文字数に制限は無い。

参考文献

World Wide Web Consortium (2021) XSL Transformations (XSLT) Version 2.0 (Second Edition)