我需要(好吧,真的很想...)将命名空间声明添加到DOM树的根元素。 我稍后在文档中重复使用该命名空间,并且在我使用它的每个节点中使用声明并不是很方便:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><test>
<value xmlns:test="urn:mynamespace" test:id="1">42.42</value>
<value2 xmlns:test="urn:mynamespace" test:id="2">Hello Namespace!</value2>
</test>
我想得到的是
<?xml version="1.0" encoding="UTF-8" standalone="no"?><test xmlns:test="urn:mynamespace">
<value test:id="1">42.42</value>
<value2 test:id="2">Hello Namespace!</value2>
</test>
稍后手动编辑会更方便。
我知道这是可能的,因为这是我加载包含
的文档时得到的结果<test xmlns:test="urn:mynamespace">
</test>
并添加剩余的节点。
所以我认为问题归结为: 如何添加xmlns:test =&#34; urn:mynamespace&#34;到根节点?当我尝试添加属性时,我得到一个NAMESPACE_ERR异常(我使用名称空间感知工厂等)。因为我试图绕过我无法找到的API的命名空间......
注意:在根元素中没有使用命名空间的属性(当我允许时,我可以使它工作),但只是命名空间声明。
答案 0 :(得分:0)
使用此XSLT文档
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:test="urn:mynamespace">
<xsl:output indent="yes" standalone="no" encoding="UTF-8"/>
<!-- Copies root element and its contents -->
<xsl:template match="/*" priority="2">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:copy-of select="namespace::*"/>
<xsl:copy-of select="document('')/*/namespace::*[name()='test']"/>
<xsl:copy-of select="@*"/>
<xsl:copy-of select="*"/>
</xsl:element>
</xsl:template>
<!-- Copies comments, processing instructions etc. outside
the root element. This is not neccesarily needed. -->
<xsl:template match="/node()">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
给出此输入(您的代码示例)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<test>
<value xmlns:test="urn:mynamespace" test:id="1">42.42</value>
<value2 xmlns:test="urn:mynamespace" test:id="2">Hello Namespace!</value2>
</test>
产生这种期望的输出
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<test xmlns:test="urn:mynamespace">
<value test:id="1">42.42</value>
<value2 test:id="2">Hello Namespace!</value2>
</test>
您可以使用Transformer
类在Java中执行XSLT转换。
javax.xml.transform.Source xsltSource = new javax.xml.transform.stream.StreamSource(xsltFile);
Transformer transformer = TransformerFactory.newInstance().newTransformer(xsltSource);
其中xsltFile
是指向该XSLT文件的File
对象。