【问题标题】:Sorting XML file by attribute按属性对 XML 文件进行排序
【发布时间】:2011-02-16 11:48:02
【问题描述】:

我有以下 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 可以有另一个 Group 等等。

有什么想法吗?

【问题讨论】:

  • 我怀疑有一个 XSL 解决方案可以解决这个问题,但我没有发布作为答案,因为我不完全确定。
  • 从您开始担心 XML 的外观的那一刻起,您就会意识到自己的时间太多了。
  • @Will:这对于缩进来说可能是正确的,但是文档顺序在 XML 中具有意义,那么为什么不实现一些依赖于文档顺序的东西呢?

标签: c# .net xml sorting


【解决方案1】:

使用XslCompiledTransform (see MSDN) 将此样式表应用于您的 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 树的嵌套深度可以是任意的。

【讨论】:

  • ...是的,像这样,是我的想法。
  • @tomalak,你的第一个 xsl:template 有一个 xsl:apply-templates 结束标记
  • 另外,&lt;xsl:copy-of select="@*" /&gt; 有必要吗?如果删除它,输出有什么不同吗?
  • @DevNull:你是对的。已更正。不,该特定输入的输出没有区别。但是如果在 actual XML 中定义了属性,它们将被复制。 &lt;xsl:copy-of select="@*" /&gt; 不会损害或降低性能,但它使解决方案正确。
  • 谢谢托马拉克。很好的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多