目次へ

2. テンプレートルール

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>

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp