2016-01-19 166 views
0

如何將選定的Xml節點移動到所選節點的最後一個。下面是一個示例xml。將Xml節點移動xslt

<Custom> 
    <Root name="root1"> 
     <Folder name="Folder1"> 
      <Node name="Sample Node"> 
       <LevelGroup> 
        <Level name="1">First Level</Level> 
        <Level name="5">Fifth Level</Level> 
       </LevelGroup> 
      </Node> 
     </Folder> 
     <Folder name="Folder2"> 
      <Node name="Node A"> 
       <LevelGroup> 
        <Level name="1">First Level</Level> 
        <Level name="2">Second Level</Level> 
       </LevelGroup> 
      </Node> 
      <Node name="Node C"> 
       <LevelGroup> 
        <Level name="4">Fourth Level</Level> 
        <Level name="5">Fifth Level</Level> 
       </LevelGroup> 
      </Node> 
     </Folder> 
    </Root> 
    <Root name="root2"> 
     <Folder name="FolderA"> 
      <Node name="Node X"> 
       <LevelGroup> 
        <Level name="1">First Level</Level> 
       </LevelGroup> 
      </Node> 
     </Folder> 
    </Root> 
    <Root name="root4"> 
     <Folder name="FolderC"> 
      <Node name="Node Z"> 
       <LevelGroup> 
        <Level name="1">First Level</Level> 
       </LevelGroup> 
      </Node> 
     </Folder> 
    </Root> 
</Custom> 
在上面的XML

,有這麼多的節點被稱爲 「」 和 「節點」。 「節點」具有名爲「名稱」的屬性。如果名稱屬性值包含字符串「示例節點」,則必須移至匹配的「節點」的最後一個。我們如何通過xslt實現這一點。下面

是預期的結果:

<Custom> 
    <Root name="root1">  
     <Folder name="Folder2"> 
      <Node name="Node A"> 
       <LevelGroup> 
        <Level name="1">First Level</Level> 
        <Level name="2">Second Level</Level> 
       </LevelGroup> 
      </Node> 
      <Node name="Node C"> 
       <LevelGroup> 
        <Level name="4">Fourth Level</Level> 
        <Level name="5">Fifth Level</Level> 
       </LevelGroup> 
      </Node> 
     </Folder> 
     <Folder name="Folder1"> 
      <Node name="Sample Node"> 
       <LevelGroup> 
        <Level name="1">First Level</Level> 
        <Level name="5">Fifth Level</Level> 
       </LevelGroup> 
      </Node> 
     </Folder> 
    </Root> 
    <Root name="root2"> 
     <Folder name="FolderA"> 
      <Node name="Node X"> 
       <LevelGroup> 
        <Level name="1">First Level</Level> 
       </LevelGroup> 
      </Node> 
     </Folder> 
    </Root> 
    <Root name="root4"> 
     <Folder name="FolderC"> 
      <Node name="Node Z"> 
       <LevelGroup> 
        <Level name="1">First Level</Level> 
       </LevelGroup> 
      </Node> 
     </Folder> 
    </Root> 
</Custom> 

的變化發生在提前

<Folder name="Folder1"> 
      <Node name="Sample Node"> 
       <LevelGroup> 
        <Level name="1">First Level</Level> 
        <Level name="5">Fifth Level</Level> 
       </LevelGroup> 
      </Node> 
     </Folder> 

感謝。

回答

1

看來你真的想移動元素是Folder而不是Node

無論如何,我認爲你必須基本上做的,就是設置爲copy-of -lines。一個爲所有這些元素沒有你的「樣本字符串」爲@name,一個爲那些與。所以,請嘗試下面的代碼:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:template match="Custom"> 
     <xsl:copy> 
     <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Root"> 
     <xsl:copy> 
      <xsl:for-each select="@*"><xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute></xsl:for-each> 

      <xsl:copy-of select="Folder[not(descendant::Node[@name='Sample Node'])]"/> 
      <xsl:copy-of select="Folder[descendant::Node[@name='Sample Node']]"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

謝謝順便。有效。 –

+0

@Gururaj Venkatakrishnarao太棒了!你能接受答案嗎? – cis