我是XSLT的新手。我想知道是否有任何方法可以从模板中获取调用模板的名称。
我目前得到了以下结构有点复杂的东西。一个模板直接包含一次,通过另一个模板包含一次。只有在从特定模板调用时,我才需要向该模板添加新标记。
<xsl:element name="parent">
<xsl:choose>
<xsl:when test="$myVariable = 'process1'">
<xsl:call-template name="templateA"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="templateB"/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
<xsl:template name="templateA">
<!-- Some Other Tags Here -->
<xsl:call-template name="templateB />"
</xsl:template>
<xsl:template name="templateb"> <!-- very big template -->
<!-- existing tags here -->
<!-- Add a new tag here only if called via templateA -->
</xsl:template>
需要明确的是,
正如您所看到的,templateB以任何一种方式都包含在内,但templateA添加了更多标签,然后包含templateB。
只有当从templateA调用时,我才想向templateB添加新标记。有可能做到吗?
您可以使用参数
<xsl:template name="templateB"> <!-- very big template -->
<xsl:param name="calledFrom" select="" />
<!-- existing tags here -->
<xsl:if test="$calledFrom = 'templateA">
<!-- Add a new tag here only if called via templateA -->
</xsl:if>
</xsl:template>
然后用这种方式称之为
<xsl:call-template name="templateB">
<xsl:with-param name="calledFrom" select="'templateA'" />
</xsl:call-template>
如果函数/模板需要知道它是从哪里调用的,那么设计就有问题。传递参数当然是修复代码的直接方法,但堆积参数并添加基于参数值的条件逻辑会导致无法维护的意大利面条。
这里没有足够的代码来评估设计,但我想问一下,为什么它没有更多地使用模板规则而不是命名模板。明智地使用应用模板很可能会更自然地解决问题。
传递参数就是解决方案,我不知道它们是否在嵌套模板中传递。
适合我的场景的解决方案是tunnel-params
。
在xslt 2.0中,参数通过隧道传输(传递)到默认调用的模板,但在xslt 1.0中,我们需要指定tunnel="yes"
。通过调谐,myVariable
可以被调用的模板访问。