スポンサーリンク

[XSLT] xsl:call-templateとxsl:apply-templatesの違いと使い方

<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 &gt;= 20">
            <age>成人</age>
        </xsl:if>
        <xsl:if test="root/data/age &lt; 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 &gt;= 20">
            <age>成人</age>
        </xsl:if>
        <xsl:if test="root/data/age &lt; 20">
            <age>未成年</age>
        </xsl:if>             
    </xsl:template>

「root/data/age」の個所が違いが分かる。
applyであれば、コンテキストノードがroot/dataになり、ageだけの指定で動く。
callであれば、コンテキストノードが変わらないので、呼び出し側のコンテキストノード「/」のまま。

<xsl:call-template>の使いどころのまとめ

呼び出し側のコンテキストノードを気にせずに、処理ができるように書きたい場合にcallが使えるのが特徴。

 

XSLT
スポンサーリンク
シェアする
trelab