按子节点内容对XML排序

按子节点内容对XML排序,xml,xmllint,Xml,Xmllint,我有一个具有以下结构的XML文档 <movements status="1"> <movement> <article>49-000003</article> <lot>0I0311</lot> <type>4</type> <date></date> </movement> &

我有一个具有以下结构的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>

49-000003
0I0311
4.
49-000013
0I0312
4.
49-000001
0I0313
4.
我如何(使用xmllint)对其进行排序,以便根据文章对移动节点进行排序


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

在您的iMac上尝试类似的方法,看看它是否有效:

xidel  your_file.xml --xquery 'for $node in //movement order by $node/article return $node' --output-format xml
如果可以使用(),那么一个简单的XSLT应该可以工作

XSLT1.0(test.xsl)


命令行

xmlstarlet tr test.xsl input.xml>output.xml
输出(Output.xml)


49-000001
0I0313
4.
49-000003
0I0311
4.
49-000013
0I0312
4.

我不确定使用xmllint是否可以做到这一点;使用xquery很容易做到这一点,但为此您需要使用xidel。如果可以的话,我可以发布一个答案。@jackfleent谢谢你的回复。我可以在Mac上安装的任何东西都是可用的。我想我可以通过自制@JackFleeting iMac:~sig$xidel安装它——Xidel0.9.8It版本可以正常工作。我可以看到在我的终端上排序的数据。但是,我需要的是一个xml文件,就像原始文件一样,对节点进行排序。谢谢,谢谢你的更新。对于未来的读者:
--output format xml>>new_file.xml
生成一个新的xml文件。是否可以更新该命令,使子节点按字母顺序排序(文章、日期、批次、类型)?请参阅当前日期是最后一个日期。谢谢。@Sig可能吧,不过我得好好想想。无论如何,我认为最好把它作为一个单独的问题发布。谢谢你的回复。在我安装所有依赖项之前,您能为我确认输出是一个已排序的XML文件吗?干杯…@Sig-我不知道你的意思;输出包含在我的答案中,
移动
元素按
文章
元素的值排序。我想知道输出是一个文件还是我终端上的一些文本。
xidel
命令对我来说很好,无需创建任何额外的XSLT文件。因此,我接受了这一点。感谢您的时间。@Sig-您可以将输出重定向到一个新文件。@Sig-我还看到了您关于对
移动的子项进行排序的评论。我也将其添加到XSLT中。