批量修改XML节点:移除rng:define元素name属性的starting_前缀
批量移除RNG define元素name属性的
starting_前缀 嘿,要把所有<rng:define>元素name属性里的starting_前缀都去掉是吧?这里有两种靠谱的实现方式,优先推荐用XSLT——毕竟处理XML就得用专门的结构化工具,比正则稳多了:
方法1:XSLT转换(推荐)
XSLT是处理XML的标准方案,能精准定位目标元素和属性,还能完整保留原XML的所有结构和其他内容。
下面是现成的XSLT代码,直接用就行:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rng="http://relaxng.org/ns/structure/1.0"> <!-- 默认模板:复制所有节点和属性,不做修改 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 专门匹配rng:define的name属性,移除starting_前缀 --> <xsl:template match="rng:define/@name"> <xsl:attribute name="name"> <xsl:value-of select="substring-after(., 'starting_')"/> </xsl:attribute> </xsl:template> </xsl:stylesheet>
使用步骤:把你的RNG文件和这个XSLT文件放在一起,用XSLT处理器(比如命令行的xsltproc,或者可视化工具Oxygen XML)执行转换,就能得到修改后的文件。
方法2:正则表达式(仅适用于结构简单的XML)
如果你只是临时处理,且确定XML里的<rng:define>格式很规整,也可以用正则快速替换。比如在VS Code、Sublime这类编辑器里:
- 查找模式:
<rng:define name="starting_([^"]+)" - 替换模式:
<rng:define name="$1"
或者用Linux/macOS的sed命令行批量处理:
sed -i 's/<rng:define name="starting_\([^"]\+\)"/<rng:define name="\1"/g' your-file.rng
⚠️ 敲黑板:正则处理XML有风险!如果name属性的位置变了、或者用了单引号,正则就可能匹配失败,所以非必要别用这个方法。
效果示例
输入的XML片段:
<rng:define name="starting_limits"> <rng:element name="limits"> <rng:ref name="Limits"/> </rng:element> </rng:define>
经过处理后会变成:
<rng:define name="limits"> <rng:element name="limits"> <rng:ref name="Limits"/> </rng:element> </rng:define>
内容的提问来源于stack exchange,提问作者Qeebrato
相关产品推荐
相关产品推荐

