3

XML 要素を数値でソートしたいのですが、最後のステップ (2 つの XML をマージする) で失敗しました。
これは私が試したことです:

xml ファイルの内容

$ cat input.xml
<root>
    <title>hello, world</title>
    <items>
        <item>2</item>
        <item>1</item>
        <item>3</item>
    </items>
</root>

アイテムを並べ替える

$ xmlstarlet sel -R -t -m '//item' -s A:N:- 'number(.)' -c '.' -n input.xml
<xsl-select>
    <item>1</item>
    <item>2</item>
    <item>3</item>
</xsl-select>

アイテムを削除

$ xmlstarlet ed -d '//item' input.xml
<?xml version="1.0"?>
<root>
  <title>hello, world</title>
  <items/>
</root>

出力をマージする方法は?結果は次のようになります。

<root>
    <title>hello, world</title>
    <items>
        <item>1</item>
        <item>2</item>
        <item>3</item>
    </items>
</root>
4

1 に答える 1

2

私は xmlstarlet に精通していませんが、ドキュメントで見たように、XML ファイル ( tr) に XSL 変換を適用するために使用できます。この XSLT でそのコマンドを使用できます。

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="items">
    <xsl:copy>
      <xsl:apply-templates select="item">
        <xsl:sort select="." data-type="number"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

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

</xsl:stylesheet>

ソートおよびマージされた出力を 1 回の操作で生成します。

于 2012-04-26T10:43:38.980 に答える