我是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 时添加新标记。有可能吗?
答案 0 :(得分:2)
您可以使用参数
<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>
答案 1 :(得分:1)
如果函数/模板需要知道它的调用位置,那么设计就会出现问题。传递参数当然是修复代码的直接方法,但是在参数上堆积并根据参数值添加条件逻辑会导致不可维护的意大利面。
这里没有足够的代码来评估设计,但我会问为什么它不会更多地使用模板规则而不是命名模板。很明显,明智地使用apply-templates可以更自然地解决问题。
答案 2 :(得分:1)
传递参数是解决方案,我不知道它们是否在嵌套模板中传递。
适合我的方案的解决方案是tunnel-params
。
参数通过隧道传递(传递)到xslt 2.0中默认调用的模板,但在xslt 1.0中我们需要指定tunnel="yes"
。通过调用myVariable
可以访问调用模板{。}}。