2013-02-01 65 views
-1

我使用XSLT。當子元素等於父元素時混合XML樹

假設這個很簡單的XML:

<ROOT> 
    <ELEMENT> 
    <ELEMENT>content of ELEMENT</ELEMENT> 
    </ELEMENT> 
</ROOT> 

我怎麼能混爲一談在XSLT XML層次結構時,子節點的名稱等於其父的名字嗎?生成的XML應該是這樣的:

<ROOT> 
    <ELEMENT>content of ELEMENT</ELEMENT> 
</ROOT> 
+3

併爲 AAA BBB期望的結果是世界衛生大會T' For aaa bbb ccc?你到目前爲止嘗試過什麼? –

+0

我認爲很難在沒有看到更復雜的例子的情況下給出一個好的答案。如果輸入XML是應該是什麼結果:'你好您好你好天兒真好' – JLRishe

回答

0

這問題並沒有多大意義;特別是當XML甚至稍微複雜一些時,如來自C. M. Sperberg-McQueen和JLRishe的例子,或者父母或孩子/兒童中存在屬性。

但是,如果我想做到這一點,XML結構是作爲你的例子一樣簡單,這是我會怎麼做:

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

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

    <xsl:template match="*[name()=name(*)]"> 
     <xsl:apply-templates/> 
    </xsl:template> 

</xsl:stylesheet> 

如果有父屬性和你想傳播那些了,你可以這樣做:

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

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

    <xsl:template match="*[name()=name(*)]" priority="1"> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="*[name()=name(../*)]"> 
     <xsl:copy> 
      <xsl:copy-of select="../@*"/> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
0

如果你先複製到/ root /元/ ELEMENT元素,然後刪除/ ROOT /元就可以把再次複製ELEMENT元素...