2017-05-24 79 views
1

我試圖重新命名以下XML重命名根標籤只使用XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<root xmlns="http://ws.apache.org/ns/synapse"> 
    <aaa> 
     <bbb> 
     <ccc>123</ccc> 
     <ggg>2010.2</ggg> 
     </bbb> 
    </aaa> 
    <ddd> 
     <eee>112</eee> 
     <fff>234</fff> 
    </ddd> 
    <ddd> 
     <eee>456</eee> 
     <fff>345</fff> 
    </ddd> 
</root> 

我試圖使用XSLT以得到下面的XML根標籤。

<?xml version="1.0" encoding="UTF-8"?> 
<zzz xmlns="http://ws.apache.org/ns/synapse"> 
    <aaa> 
     <bbb> 
     <ccc>123</ccc> 
     <ggg>2010.2</ggg> 
     </bbb> 
    </aaa> 
    <ddd> 
     <eee>112</eee> 
     <fff>234</fff> 
    </ddd> 
    <ddd> 
     <eee>456</eee> 
     <fff>345</fff> 
    </ddd> 
</zzz> 

我試着用下面的XSLT獲得上面的xml。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="root"> 
    <zzz> 
     <xsl:apply-templates select="@* | node()" /> 
    </zzz> 
</xsl:template> 
</xsl:stylesheet> 

並返回類似於輸入的相同響應。

但是,如果根標籤沒有名稱空間,則此xslt將返回預期的響應。

有人可以幫我。

+0

你的問題不明確。名稱空間是名稱的一部分;如果要重命名根元素,則必須指定新名稱應使用的名稱空間(如果有)。在下面的評論中,「動態」也不清楚你的意思。 –

回答

2

假設你想同時保持其原有的命名空間來命名根元素,你可以這樣做:

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> 

<!-- rename root (keep namespace) --> 
<xsl:template match="/*"> 
    <xsl:element name="zzz" namespace="{namespace-uri()}"> 
     <xsl:apply-templates select="@* | node()" /> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
-1

使用下面的腳本:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:syn="http://ws.apache.org/ns/synapse"> 
    <xsl:output indent="yes"/> 

    <xsl:template match="syn:root"> 
    <xsl:element name="zzz" namespace="http://ws.apache.org/ns/synapse"> 
     <xsl:apply-templates select="@* | node()" /> 
    </xsl:element> 
    </xsl:template> 

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

需作修改爲:

  • 在樣式表標籤默認源的命名空間, 給它一些名字(我用SYN)。
  • 將匹配從root更改爲syn:root
  • 使用命名空間規範創建主要元素(zzz)。
+0

感謝您的回覆。有什麼辦法動態獲取名稱空間嗎? – Jez123

+0

您的$ ns變量將包含通用的XML名稱空間。在這裏查看你的結果:http://xsltransform.net/a9GiwB –