1

是否可以对 XML 文件进行如下排序:

<model name="ford">
<driver>Bob</driver>
<driver>Alice</driver>
</model>

<model name="audi">
<driver>Carly</driver>
<driver>Dean</driver>
</model>

这将成为

<model name="audi">
<driver>Carly</driver>
<driver>Dean</driver>
</model>

<model name="ford">
<driver>Alice</driver>
<driver>Bob</driver>
</model>

也就是说,最外面的元素首先排序,然后是第二个最外面的元素,依此类推。

他们需要先按元素名称排序。

4

4 回答 4

5

这是基里尔解决方案的改进,我认为它更好地反映了规定的要求,并且它避免了类型错误 XSLT 2.0 如果排序键包含多个值(但它仍然适用于 1.0)。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" />

  <xsl:template match="*">
    <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates select="*">
      <xsl:sort select="(@name | text())[1]"/>
    </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
于 2012-07-23T11:17:59.797 回答
1

试试这个 XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" />

  <xsl:template match="@* | node()">
    <xsl:copy>
    <xsl:apply-templates select="@* | node()">
      <xsl:sort select="text() | @*"/>
        </xsl:apply-templates>
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
于 2012-07-23T10:37:04.783 回答
1

您可以通过将节点从父节点中删除并按预期顺序重新插入来对节点进行排序。例如:

def sort_tree(tree):
    """ recursively sorts the given etree in place """
    for child in tree:
        sort_tree(child)

    sorted_children = sorted(tree, key=lambda n: n.text)
    for child in tree:
        tree.remove(child)
    for child in reversed(sorted_children):
        tree.insert(0, child)

tree = etree.fromstring(YOUR_XML)
sort_tree(tree)
print(etree.tostring(tree, pretty_print=True))
于 2015-10-04T23:32:45.630 回答
0

您不需要对整个 xml dom 进行排序。而是将所需的节点放入列表中并对其进行排序。因为我们在处理时而不是在文件中需要排序顺序,所以最好在运行时完成。可能是这样,使用minidom。

import os, sys
from xml.dom import minidom
document = """\
<root>
<model name="ford">
<driver>Bob</driver>
<driver>Alice</driver>
</model><model name="audi">
<driver>Carly</driver>
<driver>Dean</driver>
</model>
</root>
"""

document = minidom.parseString(document)
elements = document.getElementsByTagName("model")
elements.sort(key=lambda elements:elements.attributes['name'])
于 2012-07-23T11:01:36.220 回答