XSLTのテンプレート

メモ:

xsl:templateやxsl:apply-templatesで囲まれた中に生成する内容を定義します。

ここでは、AmazonのAsinSearchと呼ばれる商品個別の検索を例にします。

AsinSearchで得られるデータの一部を次に示します。

<?xml version="1.0" encoding="UTF-8" ?> 
<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2005-09-15">
    <Items>
        <Item>
            <ItemAttributes>
                <Artist>Bryan Adams</Artist> 
                <Binding>CD</Binding> 
                <Creator Role="アーティスト">Bryan Adams</Creator> 
                <Title>Reckless</Title> 
            </ItemAttributes>
        </Item>
    </Items>
</ItemLookupResponse>

このXMLデータをHTMLへ変換することを考えます。

xsl:template match="/" に囲まれた部分に出力するHTMLを記述します。

match属性の/はXMLのルートを示し、ルート要素と一致したらこのタグで囲まれた部分を生成します。

上記XMLの例で、CDのタイトルをHTMLで出力するようにXSLTを作成してみます。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2005-09-15">
  <xsl:template match="/">
    <html lang="ja">
    <head>
    <title>
    <xsl:value-of select="aws:ItemLookupResponse/aws:Items/aws:Item/aws:ItemAttributes/aws:Title" />
    </title>
    </head>
    <body>
    <p>
    <xsl:value-of select="aws:ItemLookupResponse/aws:Items/aws:Item/aws:ItemAttributes/aws:Title" />
    </p>
    </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

XMLの最上位と一致したらHTMLを生成します。xsl:value-ofでTitleの値生成しHTMLのテキスト部分にするようにしています。

デフォルトテンプレート

一致したらということなので、次のようなXSLTを作成してみました。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2005-09-15">
  <xsl:template match="aws:ItemAttributes">
    <html lang="ja">
    <head>
    <title>
    <xsl:value-of select="aws:Title" />
    </title>
    </head>
    <body>
    <p>
    <xsl:value-of select="aws:Title" />
    </p>
    </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

ItemAttributesが見つかったら生成されると思ったのですが、結果は不必要な部分も出力されてしまいます。

これは、デフォルトテンプレートと呼ばれるもので、mutchしなかったノードは最終的にデフォルトテンプレートが適用されその結果出力されたようなのです。 要素ノードおよびルートノードに合ったテンプレートがない場合、デフォルトテンプレートが使用されます。