我收到一些预生成的xml文档作为字符串,我需要为缺少前缀的任何xml元素添加前缀。例如
输入:
<a xmlns:b="http://www.b.com">
<element1>test</element1>
<b:element2>test</b:element2>
</a>
输出:
<c:a xmlns:b="http://www.b.com" c="http://www.c.com">
<c:element1>test</c:element1>
<b:element2>test</b:element2>
</c:a>
我将文档解析为Node,但我无法想象如何为缺少前缀的任何元素添加前缀。我打算退回一些正则表达式字符串替换,但我认为这应该可以使用java xml api,我只是卡住了。
答案 0 :(得分:0)
以下XSLT 1.0转换将所有无命名空间元素移动到名称空间中,前缀为“c”,uri =“http://www.c.com”。
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*[namespace-uri()='']">
<xsl:element name="c:{local-name()}" namespace="http://www.c.com">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:transform>
答案 1 :(得分:0)
虽然迈克尔的回答肯定是“正确的”#34;要做到这一点,如果你想要一个没有XSLT的更简单的解决方案,那么你可以用<a xmlns:b="http://www.b.com">
替换<a xmlns="http://www.c.com" xmlns:b="http://www.b.com">
。这引入了http://www.c.com
作为默认名称空间,分配给任何明确没有名称空间前缀的元素。但请注意,这并不像迈克尔的解决方案那样通用。
如果您不想在字符串级别操作XML,您也可以解析和重写XML,例如使用Java的XMLStreamWriter
类,尤其是{{ 1}}和setDefaultNamespace()
方法。