2010-09-03 62 views
3

我發現在向上移動節點到父其他問題,但我錯過了招下來進入一個新創建的節點。移動某些子節點到一個新的水平孫子

考慮:

<Villain> 
    <Name>Dr Evil</Name> 
    <Age>49</Age> 
    <Like>Money</Like> 
    <Like>Sharks</Like> 
    <Like>Lasers</Like> 
</Villain> 

我試圖用XSLT轉換這:

<Villain> 
    <Name>Dr Evil</Name> 
    <Age>49</Age> 
    <Likes> 
    <Like>Money</Like> 
    <Like>Sharks</Like> 
    <Like>Lasers</Like> 
    </Likes> 
</Villain> 

換句話說,插入一個新的子節點,並將所有被稱爲子節點的「Like」在它下面。

+0

問得好(+1)。請參閱我的答案,瞭解一個簡短並嚴格遵循XSLT精神的解決方案。 – 2010-09-03 01:07:13

回答

4

這種轉變

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

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

    <xsl:template match="Like[1]"> 
    <Likes> 
    <xsl:apply-templates select="../Like" mode="copy"/> 
    </Likes> 
    </xsl:template> 

    <xsl:template match="*" mode="copy"> 
    <xsl:call-template name="identity"/> 
    </xsl:template> 
    <xsl:template match="Like"/> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<Villain> 
    <Name>Dr Evil</Name> 
    <Age>49</Age> 
    <Like>Money</Like> 
    <Like>Sharks</Like> 
    <Like>Lasers</Like> 
</Villain> 

產生想要的,正確的結果

<Villain> 
    <Name>Dr Evil</Name> 
    <Age>49</Age> 
    <Likes> 
     <Like>Money</Like> 
     <Like>Sharks</Like> 
     <Like>Lasers</Like> 
    </Likes> 
</Villain> 

請注意

  1. 身份規則的使用和壓倒一切的。

  2. 使用模式指定一個有點不同的處理。

+0

工作很好,謝謝!對於其他使用此方法的人,您需要在身份模板規則(未顯示)中使用name =「identity」。 – Mykro 2010-09-03 03:02:52

+0

@DJC:對不起,我遇到了代碼格式問題。現在修復。 – 2010-09-03 04:21:33

+0

@Dimitre:+1好的答案! – 2010-09-03 13:03:11

相關問題