首页 > 解决方案 > 使用 xmlstarlet 添加缺失的元素?

问题描述

我有许多包含多个地址的供应商记录,例如

<vendor>
  <addresses>
    <address primary="yes">
      <line1 />
      <city />
      <state />
      ....
     </address>
     <address primary="no">
      <line1 />
      <city />
      <state />
      ....
     </address>
  </addresses>
</vendor>

缺少一些必需的元素——阻止更新记录。如果缺少默认值,可以使用 xmlstarlet 添加元素吗?

标签: bashxmlstarlet

解决方案


这是一个简单的例子。我将xmllint --auto用于 xml 源。然后,我们将使用身份转换模式添加一个<add-me>元素作为其子元素<info>是否不存在。

源代码:

xmllint --auto
<?xml version="1.0"?>
<info>abc</info>

添加缺少的元素:

xmllint --auto | xsltproc add-missing.xsl -
<?xml version="1.0"?>
<info><add-me>some stuff</add-me>abc</info>

添加缺失.xsl:

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

    <xsl:template match="info">
        <xsl:copy>
            <xsl:if test="not(add-me)">
                <add-me>some stuff</add-me>
            </xsl:if>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

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

推荐阅读