XSLT:根据子节点的属性排序 [英] XSLT: Sort based on child node's attribute
本文介绍了XSLT:根据子节点的属性排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想根据子节点的名称属性对父节点进行排序.
I want to sort parent node, based on child's name attribute.
未排序的 XML:
<grand-parent>
<parent>
<child name="c"/>
<child_next name="a"/>
</parent>
<parent>
<child name="a"/>
<child_next name="a"/>
</parent>
<parent>
<child name="b"/>
<child_next name="a"/>
</parent>
</grand-parent>
预期输出:
<grand-parent>
<parent>
<child name="a"/>
<child_next name="a"/>
</parent>
<parent>
<child name="b"/>
<child_next name="a"/>
</parent>
<parent>
<child name="c"/>
<child_next name="a"/>
</parent>
</grand-parent>
正在使用的 XSLT(不起作用 - 返回与输入相同的 XML):
XSLT In Use (not working - returns the same XML that is input):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" method="xml" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*">
<xsl:sort select="/grand-parent/parent/child/@name" order="descending" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
推荐答案
我会排除身份转换:
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="grand-parent">
<xsl:copy>
<xsl:apply-templates select="parent|@*">
<xsl:sort select="child/@name" data-type="text"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输出
<grand-parent>
<parent>
<child name="a"/>
<child_next name="a"/>
</parent>
<parent>
<child name="b"/>
<child_next name="a"/>
</parent>
<parent>
<child name="c"/>
<child_next name="a"/>
</parent>
</grand-parent>
这篇关于XSLT:根据子节点的属性排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文