2013-07-16 28 views
0

我試圖梳理和XML元素XML元素進行排序: How to sort some XML elements according to their dependencies, by using XSLT?,但在我的情況我有以下XML:如何基於使用XSL,類似這樣的事情後他們的前輩

<root> 
    <element name="a" predecessor="x"> 
    <children> 
     <element name="b" predecessor="c"/> 
     <element name="c" predecessor="a"/> 
     <element name="d" predecessor="b"/> 
    </children> 
    </element> 
</root> 

預期的輸出將是:

<root> 
    <element name="a" predecessor="x"> 
    <children> 
     <element name="c" predecessor="a"/> 
     <element name="b" predecessor="c"/> 
     <element name="d" predecessor="b"/> 
    </children> 
    </element> 
</root> 

你能幫我實現嗎?

回答

0

你可以嘗試這樣遞歸方法:

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

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

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

    <xsl:template match="children" > 
     <xsl:copy> 
      <xsl:apply-templates select="element[@predecessor=current()/../@name]"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="element"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:copy> 
     <xsl:apply-templates select="../element[@predecessor=current()/@name]" /> 
    </xsl:template> 
</xsl:stylesheet> 

這將產生以下輸出:

<?xml version="1.0"?> 
<root> 
    <element name="a" predecessor="x"> 
     <children> 
      <element name="c" predecessor="a"/> 
      <element name="b" predecessor="c"/> 
      <element name="d" predecessor="b"/> 
     </children> 
    </element> 
</root> 
相關問題