之后
我有多个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>