按属性排序XML文件(Sorting XML file by attribute)
我有以下XML代码:
<Group> <GElement code="x"> <Group> <GElement code="x"> <fname>a</fname> <lname>b</lname> </GElement> <GElement code ="f"> <fname>fa</fname> </GElement> </Group> </GElement> <GElement code ="f"> </GElement> </Group>我希望输出按“代码”排序,如:
<Group> <GElement code ="f"> </GElement> <GElement code="x"> <Group> <GElement code ="f"> <fname>fa</fname> </GElement> <GElement code="x"> <fname>a</fname> <lname>b</lname> </GElement> </Group> </GElement> </Group>树的深度可以是无穷无尽的,即GElement可以有另一个组等等。
有任何想法吗?
I have a following XML code:
<Group> <GElement code="x"> <Group> <GElement code="x"> <fname>a</fname> <lname>b</lname> </GElement> <GElement code ="f"> <fname>fa</fname> </GElement> </Group> </GElement> <GElement code ="f"> </GElement> </Group>I would like to have the output sorted by "code" like:
<Group> <GElement code ="f"> </GElement> <GElement code="x"> <Group> <GElement code ="f"> <fname>fa</fname> </GElement> <GElement code="x"> <fname>a</fname> <lname>b</lname> </GElement> </Group> </GElement> </Group>The depth of the tree can be endless i.e. the GElement can have another Group and so on.
Any ideas?
最满意答案
使用XslCompiledTransform ( 请参阅MSDN )将此styleshet应用于XML文档:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <!-- the identity template copies everything verbatim --> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*" /> </xsl:copy> </xsl:template> <!-- special template for <Group> that sorts its children --> <xsl:template match="Group"> <xsl:copy> <xsl:copy-of select="@*" /> <!-- copy attributes, if any --> <xsl:apply-templates select="GElement"> <xsl:sort select="@code" /> </xsl:apply-templates> </xsl:copy> </xsl:template> </xsl:stylesheet>XML树的嵌套深度可以是任意的。
Use XslCompiledTransform (see MSDN) to apply this styleshet to your XML document:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <!-- the identity template copies everything verbatim --> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*" /> </xsl:copy> </xsl:template> <!-- special template for <Group> that sorts its children --> <xsl:template match="Group"> <xsl:copy> <xsl:copy-of select="@*" /> <!-- copy attributes, if any --> <xsl:apply-templates select="GElement"> <xsl:sort select="@code" /> </xsl:apply-templates> </xsl:copy> </xsl:template> </xsl:stylesheet>XML tree nesting depth can be arbitrary.
更多推荐
发布评论