2. テンプレートルール
- 2.1 テンプレートルールの定義
- 2.2 テキストの動的生成
- 2.3 テンプレートルールの適用
- 2.4 モード
- 2.5 名前付きテンプレート
XSLT を説明するためには XML 文書が必要ですので、下記の文書を以降の説明で使用することとします。
people.xml |
<?xml version="1.0"?> <people> <person born="1912" died="1954"> <name> <first_name>Alan</first_name> <last_name>Turing</last_name> </name> <profession>computer scientist</profession> <profession>mathematician</profession> <profession>cryptographer</profession> </person> <person born="1918" died="1988"> <name> <first_name>Richard</first_name> <middle_initial>P</middle_initial> <last_name>Feynman</last_name> </name> <profession>physicist</profession> <hobby>playing the bongoes</hobby> </person> </people> |
2.1 テンプレートルールの定義
<xsl:template match = pattern name = qname priority = number mode = qname> <!-- Content: (xsl:param*, template) --> </xsl:template>
ソースツリーから結果ツリーへの変換は、XML 文書を XSL ファイルで変換して、結果ツリーを生成することで実現します。1つのスタイルシートの中には複数のテンプレートルールを記述することができます。テンプレートルールとは、一言で言えば「変換の定義」で、XML 文書中のどの要素を、どのように変換したいかを記述したものです。このテンプレートルールは、xsl:template 要素で定義します。 match 属性には、ソースノードやルールの適用先ノードを識別するパターンを指定します。パターンとして指定するのは XPath 式です。match 属性は、xsl:template 要素が name 属性を含む場合を除いて必ず指定しなければいけません。name 属性にはテンプレートの名前を指定します。
以下のスタイルシートに含まれるテンプレートルールは、 person 要素が現れるたびに、テキスト "A Person" を出力するように指定しています。
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="person">A Person</xsl:template> </xsl:stylesheet>
上記のスタイルシートを people.xml に適用すると以下の出力を得ます。
<?xml version="1.0" encoding="utf-8"?> A Person A Person
2.2 テキストの動的生成
<xsl:value-of select = string-expression disable-output-escaping = "yes" | "no" />
テンプレート内では、xsl:value-of 要素を使用することにより、ソースツリーからテキストを抽出し結果ツリー内にテキストノードを生成したり、変数の値を格納することができます。 xsl:value-of 要素は、select 属性の値として指定した式を使ってこの処理を行います。
必須である select 属性の属性値には、値を抽出したいノードを XPath 式で指定します。この式を評価すると、XPath の string 関数の呼び出しを実行したかのように、結果オブジェクトは文字列に変換されます。文字列が空の場合、テキストノードは生成されません。
disable-output-escaping 属性は任意属性です。この属性が値として yes を持つなら、文書が出力されるときに値の中の < や & などの文字は、エンティティ参照や文字参照で置き換えられることはありません。
下記のスタイルシートは <p> タグと </p> タグの間にマッチした person 要素の子要素 name の値だけを出力するように指定しています。
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="person"> <p><xsl:value-of select="name" /></p> </xsl:template> </xsl:stylesheet>
このスタイルシートを people.xml に適用すると以下のテキストが出力されます。
<?xml version="1.0" encoding="utf-8"?> <p> Alan Turing </p> <p> Richard P Feynman </p>