按子节点内容排序 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>
我有一个 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>