<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が使えるのが特徴。