如何使用xslt将命名空间xmlns:xyz添加到xml文档?

时间:2012-08-19 06:45:43

标签: xml xslt

我有一些XML:

<Root>
 <Name>Eding</Name>
 <Roll>15</Roll>
 <xyz:Address>25, Brigton,SA</xyz:Address>
</Root>

此xml无效,因为未定义名称空间xyz。所以,我想使用xslt在根目录中添加命名空间。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

XSLT只会将名称空间良好的XML作为输入。因此,如果您的输入不是命名空间良好的形式,则无法使用XSLT解决问题。

答案 1 :(得分:0)

解决此问题的一种方法是使用external (parsed) general entity

你可以&#34;包装&#34;带有XML文档的无效XML文件,该文档声明xyz名称空间前缀,然后使用外部实体包含文件内容。然后转换文件以删除包装内容并生成所需输出

对于此示例,您的示例文件称为fragment.xml。我定义了一个指向该文件的外部实体,然后在wrapper元素内引用它。 wrapper元素定义了xyz名称空间前缀:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE wrapper [
<!ENTITY otherFile SYSTEM "fragment.xml">
]>
<wrapper xmlns:xyz="http://stackoverflow.com/questions/12024763/how-can-i-add-a-namespace-xmlnsxyz-to-an-xml-document-using-xslt">
&otherFile;
</wrapper>

当由任何XML解析器解析时,文档将被&#34;看到&#34;为:

<wrapper xmlns:xyz="http://stackoverflow.com/questions/12024763/how-can-i-add-a-namespace-xmlnsxyz-to-an-xml-document-using-xslt">
<Root>
    <Name>Eding</Name>
    <Roll>15</Roll>
    <xyz:Address>25, Brigton,SA</xyz:Address>
</Root>
</wrapper>

然后,使用带有模板的修改后的identity transform删除wrapper元素:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0">

    <!--identity template to copy all content forward by default -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <!--remove the "wrapper" element, then process the rest of the content -->
    <xsl:template match="/wrapper">
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>

生成以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns:xyz="http://stackoverflow.com/questions/12024763/how-can-i-add-a-namespace-xmlnsxyz-to-an-xml-document-using-xslt">
    <Name>Eding</Name>
    <Roll>15</Roll>
    <xyz:Address>25, Brigton,SA</xyz:Address>
</Root>