2017-05-31 71 views
1

互聯網上有很多引用與我有同樣的問題。這是命名空間的添加,我看到了和我一樣的這個:Adding namespace in inner parent group in xslt v2.0。但在我的情況下,我沒有父標記中的名稱空間,並將名稱空間插入到內層組中。我試圖複製解決方案,但無法獲得預期的輸出結果。例如,我有這樣的樣本文件,使用xslt2.0添加命名空間

輸入:

<Record> 
<Data> 
    <Section> 
    <ID>111222</ID> 
    </Section> 
</Data> 
</Record> 

預期:

<Record> 
<Data> 
    <Section xmlns="www.hdgd.co"> 
    <ID>111222</ID> 
    </Section> 
</Data> 
</Record> 

XSLT:

<xsl:stylesheet version="2.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()}"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
<xsl:template match="Section"> 
    <Section xmlns="www.hdgd.co"> 
     <xsl:copy-of select="*"/> 
    </Section> 
</xsl:template> 

生成的輸出在ID元素中填充了一個空的名稱空間。而且,我需要刪除那些空的xmlns。這個樣子的:

<Record> 
<Data> 
    <Section xmlns="www.hdgd.co"> 
    <ID xmlns="">111222</ID> 
    </Section> 
</Data> 
</Record> 
+0

不要認爲它是「添加命名空間」。把它想象成改變元素的名字。如果您正確地獲取元素的名稱,那麼名稱空間聲明將自行管理。元素的名稱是(名稱空間URI,本地名稱)對。 –

回答

1

不能使用:

<xsl:copy-of select="*"/> 

,因爲副本中原來的命名空間中的子節點 - 這是沒有命名空間。爲了得到你想要的結果,你不僅要Section移動到新的命名空間,但也其所有後代(並將所有其他節點,因爲它們) - 例如:

XSLT 1.0

<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="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[ancestor-or-self::Section]"> 
    <xsl:element name="{name()}" namespace="www.hdgd.co"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

謝謝@ michael.hor257k的反饋意見。 –