<xsl:call-template>と<xsl:apply-templates>の違い
<xsl:call-template>はあまり使われてる情報が少ないので、違いについて調査。
<xsl:call-template>の特徴は下記。
重要なのは、applyと違ってノードの位置が変わらないところ。
- select属性に、テンプレート名を入れる。(templateのname属性で指定したのがテンプレート名)
- コンテキストノードやカレントノードの位置が変動しない
サンプルコード
XML
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="sample.xsl"?>
<root>
<data>
<name>宮下</name>
<age>19</age>
<department>開発部</department>
</data>
</root>
XSTL
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:call-template name="年齢" />
</xsl:template>
<xsl:template match="root/data" name="年齢">
<xsl:if test="root/data/age >= 20">
<age>成人</age>
</xsl:if>
<xsl:if test="root/data/age < 20">
<age>未成年</age>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
変換結果
<?xml version="1.0" encoding="UTF-8"?> <age>未成年</age>
解説
<xsl:template match="root/data" name="年齢">
<xsl:if test="root/data/age >= 20">
<age>成人</age>
</xsl:if>
<xsl:if test="root/data/age < 20">
<age>未成年</age>
</xsl:if>
</xsl:template>
「root/data/age」の個所が違いが分かる。
applyであれば、コンテキストノードがroot/dataになり、ageだけの指定で動く。
callであれば、コンテキストノードが変わらないので、呼び出し側のコンテキストノード「/」のまま。
<xsl:call-template>の使いどころのまとめ
呼び出し側のコンテキストノードを気にせずに、処理ができるように書きたい場合にcallが使えるのが特徴。
