<xsl:call-template>と<xsl:apply-templates>の違い
<xsl:call-template>はあまり使われてる情報が少ないので、違いについて調査。
<xsl:call-template>の特徴は下記。
重要なのは、applyと違ってノードの位置が変わらないところ。
- select属性に、テンプレート名を入れる。(templateのname属性で指定したのがテンプレート名)
- コンテキストノードやカレントノードの位置が変動しない
サンプルコード
XML
1 2 3 4 5 6 7 8 9 |
<?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?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> |
変換結果
1 2 |
<?xml version="1.0" encoding="UTF-8"?> <age>未成年</age> |
解説
1 2 3 4 5 6 7 8 |
<xsl:template match="root/data" name="年齢"> <xsl:if test="<span style="color: #ff0000;">root/data/age</span> >= 20"> <age>成人</age> </xsl:if> <xsl:if test="<span style="color: #ff0000;">root/data/age</span> < 20"> <age>未成年</age> </xsl:if> </xsl:template> |
applyであれば、コンテキストノードがroot/dataになり、ageだけの指定で動く。
callであれば、コンテキストノードが変わらないので、呼び出し側のコンテキストノード「/」のまま。
<xsl:call-template>の使いどころのまとめ
呼び出し側のコンテキストノードを気にせずに、処理ができるように書きたい場合にcallが使えるのが特徴。