我有一些XML:
<Root>
<Name>Eding</Name>
<Roll>15</Roll>
<xyz:Address>25, Brigton,SA</xyz:Address>
</Root>
此xml无效,因为未定义名称空间xyz
。所以,我想使用xslt在根目录中添加命名空间。
我该怎么做?
答案 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>