在 XSLT 1.0 中有条件地复制模板(优化调用模板)

Conditionally copy a template in XSLT 1.0 (Optimizing call templates )

我想优化我的代码,

我将我的 xslt 代码用于 2 种输入,我按“类型”对输入/输出进行分类。类型可以是 =1=2.

由于输出非常相似,除了 1 个额外元素外,它基本上是相同的文件 <Extension>

我不想将“分机 1”和“分机 2”放在同一个 xsl 中。我想对两种类型都使用 one 扩展。

继续之前,在我的原始代码中,扩展有 显着 更多“元素”,并且基于 2 个以上的条件。

                               <!--templates-->
    <xsl:template name = "Header">
            <xsl:param name = "VariableMessage" />
            <xsl:param name = "VariableTime" />
            <Header>
                <MessageID>
                    <xsl:value-of select="$VariableMessage"/>
                </MessageID>
                <GeneratedTime>
                    <xsl:value-of select="$VariableTime"/>
                </GeneratedTime>
            </Header>
        </xsl:template>


    <xsl:template name = "Extension1" >
            <Tags>
                <Area>ABC</TArea>
                <Group>XYZ</Group>
                <Extensions>
                    <Extension>
                        <ExtName>CALCULATION</ExtName>
                        <ExtValue datatype="String">Owner</ExtValue>
                    </Extension>
                    <Extension>
                        <ExtName>GROUP</ExtName>
                        <ExtValue datatype="String">XYZ</ExtValue>
                    </Extension>
              </Extensions>
          </Tags>
</xsl:template>

    <xsl:template name = "Extension2" >
            <Tags>
                <Area>ABC</TArea>
                <Group>XYZ</Group>
                <Extensions>
                    <Extension>
                        <ExtName>CALCULATION</ExtName>
                        <ExtValue datatype="String">Owner</ExtValue>
                    </Extension>
              </Extensions>
          </Tags>
</xsl:template>
                
                            <!--close templates-->

现在,我的代码:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                            <!--variables-->
    <xsl:variable name="typology" select="//typology"/>
    <xsl:variable name="VariableMessage" select="//VariableMessage"/>
    <xsl:variable name="VariableTime" select="//VariableTime"/>


                 <!--parameters for a call-template-->
    <xsl:template match="/">
        <xsl:call-template name="Header">
            <xsl:with-param name="VariableMessage" select = "$VariableMessage"/>
            <xsl:with-param name="VariableTime select = "$VariableTime"/>
        </xsl:call-template>
                                            


                         <!--/Extensions/-->
           <!--depends in the Typology: can be either 1 or 2-->
        <xsl:choose>
            <xsl:when test="$typology='1'">
                <xsl:call-template name="Extensions1"></xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:call-template name="Extensions2"></xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>


    </xsl:template>

</xsl:stylesheet>

我可以使用类似的东西吗,确保我正在复制“Extension” 如何根据条件为此特定模板指定“复制”元素

   <xsl:template match="@*|node()">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
 </xsl:template>

如果没有看到输入示例和预期输出,很难理解这一点。 AFAICT,你可以使用类似的东西:

<xsl:template name="Extension">
    <Tags>
        <Area>ABC</TArea>
        <Group>XYZ</Group>
        <Extensions>
            <Extension>
                <ExtName>CALCULATION</ExtName>
                <ExtValue datatype="String">Owner</ExtValue>
            </Extension>
            <xsl:if test="$typology=1">
                <Extension>
                    <ExtName>GROUP</ExtName>
                    <ExtValue datatype="String">XYZ</ExtValue>
                </Extension>
            </xsl:if>
        </Extensions>
    </Tags>
</xsl:template>

看不出复制模板与此有什么关系。

也不确定为什么需要那些命名模板。似乎您可以在主模板中完成所有操作,而不会增加复杂性。