如何根据XML元素的前辈对其进行排序
我尝试使用XSL对XML元素进行排序,类似于本文: ,但在我的例子中,我有以下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
<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>