我有一个具有以下结构的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文件。
答案 0 :(得分:1)
在iMac上尝试类似的操作,看看它是否可以工作:
xidel your_file.xml --xquery 'for $node in //movement order by $node/article return $node' --output-format xml
答案 1 :(得分:0)
如果您可以使用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>