2012-07-11 216 views
0

我的問題是,我想在XML節點移動之後他們出現的節點f.eks: 我有一個XML,看起來像這樣:映射到m

<root> 
    <node>a</node> 
    <node>b</node> 
    <node>c</node> 
    <top1> 
    <node>d</node> 
    <node>e</node> 
    <top2> 
</root> 

並應最終成爲

<root> 
    <top1> 
    <node>a</node> 
    <node>b</node> 
    <node>c</node> 
    </top1> 
    <top2> 
    <node>d</node> 
    <node>e</node> 
    </top2> 
</root> 

但我沒有任何可以做到這一點的xsl。我給了它一些使用position()的嘗試,但沒有讓我更接近。 誰能告訴我正確的方法

+0

向我們展示您嘗試過的。另外,您發佈的輸入XML無效 - 某些節點缺少結束標籤或應自動關閉。 – Utkanos 2012-07-11 20:39:58

回答

0

這裏有一個選項:

XML輸入(修正爲合格的)

<root> 
    <node>a</node> 
    <node>b</node> 
    <node>c</node> 
    <top1/> 
    <node>d</node> 
    <node>e</node> 
    <top2/> 
</root> 

XSLT 1.0

<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="root"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|*[starts-with(name(),'top')]"/> 
     </xsl:copy>  
    </xsl:template> 

    <xsl:template match="*[starts-with(name(),'top')]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|preceding-sibling::node[(following-sibling::*[starts-with(name(),'top')])[1][generate-id() = generate-id(current())]]"/> 
     </xsl:copy>  
    </xsl:template> 

</xsl:stylesheet> 

輸出

<root> 
    <top1> 
     <node>a</node> 
     <node>b</node> 
     <node>c</node> 
    </top1> 
    <top2> 
     <node>d</node> 
     <node>e</node> 
    </top2> 
</root> 
+0

非常感謝你所描述的工作。 – user1518851 2012-07-12 07:05:17

+0

但我忘了一個「細節」 - 已經有「頂級」節點中的元素應該留在那裏。如下所述。 – user1518851 2012-07-12 07:07:22

+0

@ user1518851在最後一個'' – 2012-07-12 10:18:33

0

我的輸入是這樣的: 這並不與上面的XSL工作 - 它消除了孩子們在頂部的元素。

<root> 
    <node>a</node> 
    <node>b</node> 
    <node>c</node> 
    <top1> 
     <node>1</node> 
     <node>2</node> 
    </top1> 
    <node>d</node> 
    <node>e</node> 
    <top2> 
     <node>3</node> 
     <node>4</node> 
    </top2> 
</root> 
+0

裏面加上''我找到了一個解決方案 - 這只是一個應用 user1518851 2012-07-12 10:31:32