按子节点内容排序 XML

Sorting XML by subnode content

我有一个 XML 文档,其结构如下

<movements status="1">
    <movement>
        <article>49-000003</article>
        <lot>0I0311</lot>
        <type>4</type>
        <date></date>
    </movement>
    <movement>
        <article>49-000013</article>
        <lot>0I0312</lot>
        <type>4</type>
        <date></date>
    </movement>
    <movement>
        <article>49-000001</article>
        <lot>0I0313</lot>
        <type>4</type>
        <date></date>
    </movement>
</movements>

我如何(使用 xmllint)对其进行排序,以便移动节点按文章排序?

我需要输出另一个 XML 文件。

在你的 iMac 上试试这样的东西,看看它是否有效:

xidel  your_file.xml --xquery 'for $node in //movement order by $node/article return $node' --output-format xml

如果可以使用 xmlstarlet (tr command),一个简单的 XSLT 应该可以工作...

XSLT 1.0 (test.xsl)

<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="/*">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()">
        <xsl:sort select="article"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="movement">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates select="node()">
        <xsl:sort select="name()"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

命令行

xmlstarlet tr test.xsl input.xml > output.xml

输出 (output.xml)

<movements status="1">
   <movement>
      <article>49-000001</article>
      <date/>
      <lot>0I0313</lot>
      <type>4</type>
   </movement>
   <movement>
      <article>49-000003</article>
      <date/>
      <lot>0I0311</lot>
      <type>4</type>
   </movement>
   <movement>
      <article>49-000013</article>
      <date/>
      <lot>0I0312</lot>
      <type>4</type>
   </movement>
</movements>