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しなかったノードは最終的にデフォルトテンプレートが適用されその結果出力されたようなのです。 要素ノードおよびルートノードに合ったテンプレートがない場合、デフォルトテンプレートが使用されます。