![在 XML 文件的层次结构内查找-替换](https://linux22.com/image/1497070/%E5%9C%A8%20XML%20%E6%96%87%E4%BB%B6%E7%9A%84%E5%B1%82%E6%AC%A1%E7%BB%93%E6%9E%84%E5%86%85%E6%9F%A5%E6%89%BE-%E6%9B%BF%E6%8D%A2.png)
我有大约 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())"