0

我正在尝试使用 XSL 对 XML 元素进行排序,类似于这篇文章: How to sort some XML elements based on their dependencies, by using XSLT? ,但在我的情况下,我有以下 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>

你能帮我实现这一目标吗?

4

1 回答 1

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>
于 2013-07-16T16:47:34.230 回答