2014-05-21 45 views
0

我有一個XML文件,如下所示。 CONTROLHOLDER是家長,它可以在其內部具有子級CONTROLHOLDER到第n級。 但我想將所有此類兒童CONTROLHOLDER及其內容取出,並將其放在家長CONTROLHOLDER下方作爲家長。 讓我知道這個使用XSLT將XML文件中的子節點移動到父項

<CONTROLS> 
<CONTROLHOLDER ID="CH1"> 
    <CONTROL11 ID="ED1">   
    <CONTROL11> 
    <CONTROL12 ID="ED2"> 
    </CONTROL12> 
</CONTROLHOLDER> 
<CONTROLHOLDER ID= "CH2"> 
    <CONTROL21 ID="ED3">   
    <CONTROL21> 
    <CONTROL22 ID="ED4"> 
    </CONTROL22> 
     <CONTROLHOLDER ID= "CH21"> 
      <CONTROL211 ID="ED5" > 
      <CONTROL211> 
      <CONTROL212 ID="ED6" > 
      </CONTROL212> 
     </CONTROLHOLDER> 
</CONTROLHOLDER> 
<CONTROLHOLDER ID= "CH3"> 
    <CONTROL31 ID="ED31"> 
    <CONTROL31> 
    <CONTROL32 ID="ED32"> 
    </CONTROL32> 
     <CONTROLHOLDER ID= "CH31"> 
      <CONTROL311 ID= "ED311"> 
      <CONTROL311> 
      <CONTROL312 ID= "ED312"> 
      </CONTROL312> 
       <CONTROLHOLDER ID= "CH313"> 
        <CONTROL3131 ID= "ED3131"> 
        <CONTROL3131> 
        <CONTROL3132 ID= "ED3132"> 
        </CONTROL3132> 
       </CONTROLHOLDER> 
     </CONTROLHOLDER> 
</CONTROLHOLDER> 

而最值得推薦的方式需要轉換爲

<CONTROLS> 
<CONTROLHOLDER ID="CH1"> 
    <CONTROL11 ID="ED1">   
    <CONTROL11> 
    <CONTROL12 ID="ED2"> 
    </CONTROL12> 
</CONTROLHOLDER> 
<CONTROLHOLDER ID= "CH2"> 
    <CONTROL21 ID="ED3">  
    <CONTROL21> 
    <CONTROL22 ID="ED4"> 
    </CONTROL22>  
</CONTROLHOLDER> 
<CONTROLHOLDER ID= "CH21"> 
    <CONTROL211 ID="ED5" > 
    <CONTROL211> 
    <CONTROL212 ID="ED6" > 
    </CONTROL212> 
</CONTROLHOLDER> 
<CONTROLHOLDER ID= "CH3"> 
    <CONTROL31 ID="ED31"> 
    <CONTROL31> 
    <CONTROL32 ID="ED32"> 
    </CONTROL32> 
</CONTROLHOLDER> 
<CONTROLHOLDER ID= "CH31"> 
    <CONTROL311 ID= "ED311"> 
    <CONTROL311> 
    <CONTROL312 ID= "ED312"> 
    </CONTROL312>   
</CONTROLHOLDER> 
<CONTROLHOLDER ID= "CH313"> 
    <CONTROL3131 ID= "ED3131"> 
    <CONTROL3131> 
    <CONTROL3132 ID= "ED3132"> 
    </CONTROL3132> 
</CONTROLHOLDER> 

+1

你的XML樣本沒有很好地形成的,順便說一句。您應該在結束標籤處打開標籤! –

回答

1

與身份模板開始關閉處理現有節點

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

然後,你說你想要一個模板來將子節點,元素,移動到它們的父節點。那麼,只需要一個模板匹配CONTROLHOLDER複製它,它的所有孩子除了其他CONTROLHOLDER元素。對於任何這樣的子元素,複製這些副本父後,像這樣

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

注意這個模板是遞歸的,所以所有CONTROLHOLDER將「冒泡」是主要的根元素。

試試這個XSLT

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

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

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

謝謝。這很好。只是添加一個場景。如果我有另一個ControlHolder類型,例如ControlHolderTypeA和ControlHolderTypeB,並且如果我發現它們中的任何一個,我想將它從Inside Parent中移出,那麼將會如何。請注意,ControlHolderTypeB可以是ControlHolderTypeA的子項,也可以是Versa的子項。 – user3657957

+0

沒關係。我得到了修改後的問題的答案 – user3657957

+0

你好Tim,實際上當我有ControlHolder(ControlHolderTypeA和ControlHolderTypeB)的2個類別,並且假設ControlHolderTypeA可以在ControlHolderTypeB的內部,反之亦然,這是行不通的。 – user3657957

相關問題