0

我对 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添加一个新标签。有可能吗?

4

3 回答 3

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>
于 2013-07-12T12:56:35.410 回答
1

如果一个函数/模板需要知道它是从哪里调用的,那么设计就有问题。传递参数当然是修复代码的直接方法,但是堆积参数并根据参数值添加条件逻辑会导致无法维护的意大利面条。

这里没有足够的代码来评估设计,但我会问为什么它没有更多地使用模板规则而不是命名模板。明智地使用应用模板很可能会更自然地解决问题。

于 2013-07-12T13:25:20.203 回答
1

传递参数是解决方案,我不知道它们是否在嵌套模板中传递。

适合我的方案的解决方案是 tunnel-params.

在 xslt 2.0 中,参数被隧道化(传递)到默认调用的模板,但在 xslt 1.0 中我们需要指定tunnel="yes". 使用 TunellingmyVariable可以访问调用的模板。

于 2013-07-12T14:25:33.810 回答