是" xsl:apply-templates模式"复制"复制整个节点,还是只复制数据?

时间:2013-01-11 20:54:30

标签: xml xslt xsd

我有以下XSLT元素:

<xsl:template match="Product">
    <product>
        ...
        <xsl:if test="string-length(PerProductShipping) > 0">
            <xsl:apply-templates select="PerProductShipping" mode="Copy">
                <xsl:with-param name="name">per_product_shipping</xsl:with-param>
            </xsl:apply-templates>
        </xsl:if>
    </product>
</xsl:template>

<xsl:template match="*" mode="Copy">
    <xsl:param name="name" select="name()"/>
        <xsl:element name="{$name}">
            <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

这是我目前的输出:

<per_product_shipping>8.79</per_product_shipping>

这是我想要的输出:

<per_product_shipping is_absolute="true">8.79</per_product_shipping>

is_absolute="true"元素将被硬编码,并始终存在。

如何向此xsl:template添加属性?

2 个答案:

答案 0 :(得分:2)

正如聊天中所讨论的,您的mode =“Copy”模板是一个通用模板,它创建一个具有参数中指定名称的元素,然后为匹配的节点提供相同的文本值。我认为在这种情况下最合适的解决方案是替换它:

<xsl:apply-templates select="PerProductShipping" mode="Copy">
    <xsl:with-param name="name">per_product_shipping</xsl:with-param>
</xsl:apply-templates>

用这个:

<per_product_shipping is_absolute="true">
  <xsl:value-of select="PerProductShipping" />
</per_product_shipping>

答案 1 :(得分:1)

我也会推荐这种方法:

<xsl:element name="per_product_shipping"> 
<xsl:attribute name="is_absolute">true</xsl:attribute> 
<xsl:value-of select="..." /> 
</xsl:element>

通过这种方式,您可以动态控制生成的XML。