基于特定文本匹配的XML转换需求:XSLTPROC修改内容并添加节点
XSLT解决方案:匹配特定文本并修改节点内容、添加同级节点
核心修改点
- 精准定位目标节点:通过
local-name()处理命名空间和不固定的节点名称,匹配ProcessDefinition下任意前缀的activity节点内的config/endpointURL,且文本内容为%%some/Global%%。 - 替换指定文本:将匹配到的
endpointURL文本替换为%%new/Code%%。 - 正确注入ssl节点:将ssl节点输出在
endpointURL同级位置(而非内部),符合期望的XML结构。
完整XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns999="http://some/xmlns/target" exclude-result-prefixes="ns999"> <xsl:output method="xml" indent="yes"/> <!-- 身份模板:复制所有未被自定义模板匹配的节点和属性,保留原XML结构 --> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <!-- 匹配符合条件的endpointURL节点 --> <xsl:template match="*[local-name()='ProcessDefinition']/*[local-name()='activity']/config/endpointURL[normalize-space(text())='%%some/Global%%']"> <!-- 复制endpointURL节点并替换文本内容 --> <xsl:copy> <xsl:text>%%new/Code%%</xsl:text> </xsl:copy> <!-- 在endpointURL同级位置添加ssl节点 --> <ns999:ssl> <ns999:strongCipherSuitesOnly>true</ns999:strongCipherSuitesOnly> <ns999:cert isRef="true">/.folder</ns999:cert> </ns999:ssl> </xsl:template> </xsl:stylesheet>
代码说明
- 身份模板:作为XSLT转换的基础,确保原XML中未被修改的节点和属性完全保留。
- 目标节点匹配规则:
*[local-name()='ProcessDefinition']:匹配任意命名空间下的ProcessDefinition节点,避免前缀限制。*[local-name()='activity']:匹配任意命名空间下的activity节点,解决节点名称/前缀不固定的问题。endpointURL[normalize-space(text())='%%some/Global%%']:使用normalize-space()去除文本前后的换行、空格,确保精准匹配目标内容。
- 内容修改与节点添加:
- 复制
endpointURL节点后直接写入新文本,完成内容替换。 - 在
endpointURL节点输出完成后,紧接着输出ns999:ssl节点,确保其位于config块内、endpointURL的下方,符合预期结构。
- 复制
执行命令
通过xsltproc执行转换:
xsltproc your-transform.xsl input.xml > output.xml
内容的提问来源于stack exchange,提问作者scaleTillDust
相关产品推荐
相关产品推荐

