2017-09-14 90 views
0

我正在接收一些預生成的xml文檔作爲字符串,我需要爲所有缺少前綴的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> 

我已經將文檔解析成一個節點,但我想不出如何添加前綴到缺少任何元素一個前綴。我打算迴歸一些正則表達式替換字符串,但我認爲這應該是可能的java xml api,我只是卡住了。

回答

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> 
0

雖然邁克爾的回答肯定是「正確」的方式做到這一點,如果你想不XSLT手頭的XML一個簡單的解決方案,你可以僅僅通過更換<a xmlns="http://www.c.com" xmlns:b="http://www.b.com"><a xmlns:b="http://www.b.com">。這引入了http://www.c.com作爲默認命名空間,以明確地分配給沒有命名空間前綴的任何元素。但請注意,這不像邁克爾的解決方案那樣通用。

如果你不想在串級來操作XML,你可以解析和使用Java的XMLStreamWriter類重寫XML爲好,例如,特別是setDefaultNamespace()writeDefaultNamespace()方法。