2016-02-26 211 views
2

我有一個XML:XSLT添加屬性爲xml根節點

<doc> 
    <tag1> 
     <tag11>1</tag11> 
     <tag12>abc</tag12> 
     <tag13>test</tag13> 
     <tag14>content</tag14> 
     <tag15>2-</tag15> 
     <tag16>content</tag16> 
     <tag17> 
     <tag171>TITLE</tag171> 
     <tag172>T3</tag172> 
     <tag173>No</tag173> 
     <tag17> 
     <tag18 id="t/9905">aaa</tag18> 
     <tag18 id="t/9905">bbb</tag18> 
    </tag1> 
    <tag2> 
     <tag21>2016</tag21> 
     <tag22> 
     <tag221>1</tag221> 
     <tag222>OMG</tag222> 
     </tag22> 
     <tag23> 
     <tag231>Test</tag231> 
     <tag232>2016-01-18T00:00:00</tag232> 
     <tag233>This is a test</tag233> 
     </tag23> 
    </tag2> 
</doc> 

我想的屬性(命名空間)添加到根元素:/ DOC使得輸出將如下所示:

<doc xmlns="urn:test"> 
    <tag1> 
     <tag11> 
     <othertags /> 
     </tag11> 
    </tag1> 
    <tag2> 
     <tag21> 
     <othertags2 /> 
     </tag21> 
    </tag2> 
</doc> 

我試過三個xslt(跳過默認複製所有部分以減少問題的長度)。

xslt1:下面看到的,該問題是,空的命名空間的xmlns = 「」 被添加到/文件的所有子節點(即:/ DOC/TAG1和/ DOC/TAG2)

<xsl:template match="/doc"> 
    <xsl:element name="{local-name()}" namespace="urn:test" > 
     <xsl:copy-of select="attribute::*"/> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:element> 
</xsl:template> 

Xslt2 :見下文,問題是,「NS」被添加到根節點:和

<xsl:template match="/*"> 
    <xsl:element name="ns:{local-name()}" namespace="urn:test"> 
     <xsl:apply-templates select="node()|@*" /> 
    </xsl:element> 
</xsl:template> 

xslt3:下面看到的,問題是,錯誤報告:未定義命名空間前綴「甕」。 XPST0081:表達式中使用的名稱空間前綴必須使用靜態已知名稱空間可擴展到名稱空間URI中。

<xsl:template match="/*"> 
    <xsl:copy> 
     <xsl:attribute name="xmlns"> 
     <xsl:value-of select="urn:test" /> 
     </xsl:attribute> 
    <xsl:copy-of select="@*" /> 
    <xsl:apply-templates /> 
    </xsl:copy> 
</xsl:template> 

我只想用xmlns =「urn:test」與根節點/ doc進行簡單的輸出。

任何幫助,將不勝感激!

回答

2

我想的屬性(命名空間)添加到根元素

命名空間聲明是的屬性。而這裏所要求的改變並不單單是根元素:在根中聲明的命名空間是由它的所有後代繼承的。這意味着你需要移動所有元素融入到新的命名空間:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="*"> 
    <xsl:element name="{local-name()}" namespace="urn:test"> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

邁克爾,感謝您的回答。您提供的xslt與我的第一個xslt具有相同的輸出。我真的不想在所有子節點上都有「xmlns =」「」。有沒有辦法使用第二個xslt在子節點上刪除它? – dellair

+0

@dellair我的XSLT的輸出在所有子節點上都沒有「xmlns =」「」 - 請參閱:http://xsltransform.net/pPzifq3 –

+0

這絕對是我的錯。我剛剛編輯了這個問題,並複製了完整的xml。您可以看到「xmlns =」「」已被添加到具有完整xml的子節點中。 – dellair