【发布时间】:2012-12-20 14:36:17
【问题描述】:
我在这方面遇到了比我应该的更多的麻烦,并且无法找到似乎正确的解决方案:
我想简单地使用 xslt 1.0 更改 XML 文档的名称空间 - 用于 java 应用程序,使用 javax.xml.transform。
这是我的 xml 文档:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root xmlns="http://namespace1.org" type="Document" version="V2_2">
<Content>
<Text>asdf</Text>
</Content>
</Root>
这就是它在转换后的样子:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root xmlns="http://namespace2.org" type="Document" version="V2_2">
<Content>
<Text>asdf</Text>
</Content>
</Root>
这是我的 xslt 代码:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://namespace2.org">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="http://namespace2.org">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
这是我转换后得到的实际输出:
<?xml version="1.0" encoding="UTF-8"?>
<ns0:Root xmlns:ns0="http://namespace2.org">2012-11-02T15:39:46.05+01:00DocumentV2_2<ns1:Content xmlns:ns1="http://namespace2.org">
<ns2:Text xmlns:ns2="http://namespace2.org">asdf</ns2:Text>
</ns1:Content>
</ns0:Root>
添加了很多前缀,我不想要。
我已经能够通过使用以下 xlst 摆脱 ns+increment 前缀:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://namespace2.org"
xmlns:cmp="http://namespace2.org"
exclude-result-prefixes="cmp">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:element name="cmp:{name()}" namespace="http://namespace2.org">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
产生以下输出:
<?xml version="1.0" encoding="UTF-8"?>
<cmp:Root xmlns:cmp="http://namespace2.org" type="Document" version="V2_2">
<cmp:Content>
<cmp:Text>asdf</cmp:Text>
</cmp:Content>
</cmp:Root>
但我一直无法摆脱“cmp”前缀。
有什么想法可以达到预期的输出吗?
【问题讨论】:
-
我很好奇 - 如果您使用的是 Java,那么您到底为什么还在使用 XSLT 1.0?