2016-01-19 3 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, есть так много узлов называется «Root» и «Узел». «Узел» имеет атрибут с именем «name». Если значения атрибута name Содержит строку «Sample Node», она должна перейти к последнему из совпадающих «Узел». Как мы можем достичь этого с помощью 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 -линий. Один для всех этих элементов без вашей «строки образца» как @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

Thanks Cis. это сработало. –

+0

@Gururaj Venkatakrishnarao Это здорово! Можете ли вы принять ответ? – cis

Смежные вопросы