按子节点内容对XML进行排序

问题描述 投票:0回答:2

我有一个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文件。

xml xmllint
2个回答
1
投票

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

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

0
投票

如果你能用 xmlstarlet (tr 指挥),一个简单的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>
© www.soinside.com 2019 - 2024. All rights reserved.