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

これはKirillのソリューションを改良したものであり、記載されている要件をより適切に反映していると思います。また、並べ替えキーに複数の値が含まれている場合に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 に答える
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 に答える