在 XML 文件的层次结构内查找-替换

在 XML 文件的层次结构内查找-替换

我有大约 350 个 XML 文件分布在整个/abc目录中。我想找到 alt 属性值恰好为 '啦啦啦':

<image alt="blah blah" src="../webcontent/filename.png">
    <caption>
        Figure 1.1: Typical Components of Blah Blah
    </caption>
</image>

alt并用括起来的内容替换属性的值caption(删除换行符)

<image alt="Figure 1.1: Typical Components of Blah Blah" src="../webcontent/filename.png">
    <caption>
        Figure 1.1: Typical Components of Blah Blah
    </caption>
</image>

我愿意在 Ubuntu 或 Windows 上运行脚本,或者使用任何文本编辑工具。

假设换行符和缩进一致是不安全的。另外,并非所有图像都有标题。路径中的所有 XML 文档都是格式正确的。

有没有一种简单的方法可以就地编写此替换脚本?我愿意尝试适用于单个文件的方法;我可以将其扩展为递归运行。

答案1

对于单个文件,以下 XSLT 样式表将完成该工作:

<t:transform version="1.0" xmlns:t="http://www.w3.org/1999/XSL/Transform">
  <t:template match="node()|@*">
    <t:copy>
      <t:apply-templates select="node()|@*"/>
    </t:copy>
  </t:template>
  <t:template match="image/@alt[. = 'blah blah']">
    <t:attribute name="alt" select="normalize-space(../caption)"/>
  </t:template>
</t:transform>

要处理多个文件,您可以从某些 shell 脚本、Ant 脚本或类似脚本(或查看 xmlsh)多次调用样式表,或者如果您使用的是 XSLT 2.0 处理器(如 Saxon),则可以使用 collection() 函数在 XSLT 本身内编写脚本

答案2

您还可以使用xmlstarlet

xmlstarlet ed -u '//image/@alt[.= "blah blah"]' -x "normalize-space(../caption/text())"

相关内容