如何使用 xmlstarlet 合并两个 xml



我想按数字对xml元素进行排序,但在最后一步(合并两个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>
我不

熟悉 xmlstarlet,但对于我在其文档中看到的内容,它可用于将 XSL 转换应用于 XML 文件 ( tr ) - 您可以将该命令与此 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>

在单个操作中生成排序和合并的输出。

自从你问了已经有一段时间了,但尽管如此。以下外壳脚本使用多阶段管道生成所需的结果 --尽管这不是处理较大输入的最佳方式。有关将 XInclude 与xmlstarlet一起使用的方法,请参阅这个答案。

# shellcheck shell=sh
xmlstarlet select -R -t -m '//item' -s 'A:N:-' '.' -c '.' input.xml |
xmlstarlet select -R -t -c '/ | document("-")' input.xml |
xmlstarlet edit 
  -d '/xsl-select/root//item' 
  -m '/xsl-select/xsl-select/item' '/xsl-select/root/items' |
xmlstarlet select -B -I -t -c '/xsl-select/*[1]'
  1. 运行 select 以提取 item 秒的排序文件(到 stdout
  2. 运行 select 以复制原始输入和排序的文件,以及( -R ) 使用 XSLT 将它们包装在一起 document访问功能stdin上排序的文件(下面列出了此步骤的输出)
  3. 调用edit删除未排序的item并移动已排序的 item到位
  4. 运行select以提取合并的文档并设置其格式

步骤 2 的输出(缩进):

<xsl-select>
  <root>
    <title>hello, world</title>
    <items>
      <item>2</item>
      <item>1</item>
      <item>3</item>
    </items>
  </root>
  <xsl-select>
    <item>1</item>
    <item>2</item>
    <item>3</item>
  </xsl-select>
</xsl-select>

相关内容

  • 没有找到相关文章

最新更新