如何根据XML元素的前辈对其进行排序

如何根据XML元素的前辈对其进行排序,xml,sorting,xslt,Xml,Sorting,Xslt,我尝试使用XSL对XML元素进行排序,类似于本文: ,但在我的例子中,我有以下xml: <root> <element name="a" predecessor="x"> <children> <element name="b" predecessor="c"/> <element name="c" predecessor="a"/> <element name="d" p

我尝试使用XSL对XML元素进行排序,类似于本文: ,但在我的例子中,我有以下xml:

<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>


你能帮我做到这一点吗?

你可以试试这种递归方法:

<?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>