复制all,在其他命名空间中添加元素,在根节点上声明命名空间

时间:2014-02-06 09:02:20

标签: xml xslt xslt-2.0

我有多个XML文件,可以作为XSLT的输入。在这些多输入XML文件中,我不知道可以使用的所有命名空间,我不知道可以使用的所有根节点,我所知道的是所有元素都在一个命名空间中。

所以我的输入XML可能是:

<?xml version="1.0" encoding="UTF-8"?>
<foo:someUnknownRoot xmlns:foo="http://anUnknownNamespace/foo">
    <foo:element>value</foo:element>
</foo:someUnknownRoot>

另一个可能是:

<?xml version="1.0" encoding="UTF-8"?>
<bar:anotherUnknownRoot xmlns:bar="http://anUnknownNamespace/bar">
    <bar:element>value</bar:element>
</bar:anotherUnknownRoot>

我想创建一个只复制完整输入的XSLT,并在自己定义的前缀中添加元素。我希望在根节点上声明命名空间。

所以我希望像这样的输出(一个例子):

<?xml version="1.0" encoding="UTF-8"?>
<bar:anotherUnknownRoot xmlns:bar="http://anUnknownNamespace/bar" xmlns:added="http://myAddedNamespace/added">
    <added:element>value</added:element>
    <bar:element>value</bar:element>
</bar:anotherUnknownRoot>

我尝试过以下XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:added="http://myAddedNamespace/added">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

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

    <xsl:template match="/*">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <added:element>value</added:element>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

但这会输出:

<?xml version="1.0" encoding="UTF-8"?>
<bar:anotherUnknownRoot xmlns:bar="http://anUnknownNamespace/bar">
    <added:element xmlns:added="http://myAddedNamespace/added">value</added:element>
    <bar:element>value</bar:element>
</bar:anotherUnknownRoot>

当然这是正确的XML,但为了便于阅读,我想将“添加的”命名空间添加到根节点。

1 个答案:

答案 0 :(得分:0)

只需添加

<xsl:namespace name="added">http://myAddedNamespace/added</xsl:namespace>
<xsl:copy>

之后