在 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>
看不出复制模板与此有什么关系。
也不确定为什么需要那些命名模板。似乎您可以在主模板中完成所有操作,而不会增加复杂性。
我想优化我的代码,
我将我的 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>
看不出复制模板与此有什么关系。
也不确定为什么需要那些命名模板。似乎您可以在主模板中完成所有操作,而不会增加复杂性。