在XSLT中,向副本添加元素会多次添加。为什么?

时间:2016-03-23 13:55:30

标签: xml xslt

考虑以下情况。给定:XML和XSLT:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xalan">
    <xsl:output method="xml" indent="yes" xalan:indent-amount="2" encoding="UTF-8" />
    <xsl:strip-space elements="*" />
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="info">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
            <xsl:element name="foo">
                <xsl:text>bar</xsl:text>
            </xsl:element>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <info>
        <somthing>lorem ipsum</somthing>
    </info>
</root>

使用给定的XSLT模板转换XML时,我得到了这个结果

<?xml version="1.0" encoding="UTF-8"?><root>
  <info>
    <somthing>lorem ipsum</somthing>
    <foo>bar</foo>
    <foo>bar</foo> <!-- too much -->
    <foo>bar</foo> <!-- too much -->
  </info>
</root>

它应该标识复制XML文档并将<foo>bar</foo>附加到<info>元素,但它会添加两个aditional <foo>。我尝试了很多,但无法弄清楚为什么会这样做?

1 个答案:

答案 0 :(得分:0)

您可以尝试从第二个模板中删除标签xsl:apply-templates吗?

<xsl:template match="info">
    <xsl:copy>
        <xsl:element name="foo">
            <xsl:text>bar</xsl:text>
        </xsl:element>
    </xsl:copy>
</xsl:template>