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



我有多个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,该XSLT仅复制完整的输入,并在自己定义的前缀中添加元素。我喜欢在root节点上声明的名称空间。

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

<?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,但是对于可读性,我想将"添加"名称空间添加到根节点。

只需添加

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

<xsl:copy>

之后

最新更新