如何使用XSLT匹配两个XML文件的属性值并替换文本?
没问题,我来帮你实现这个跨XML文件的属性匹配和文本替换需求。这里需要用到XSLT的document()函数来加载外部的hostid映射文件,通过属性值关联匹配,具体方案如下:
使用XSLT跨XML文件匹配属性值并替换文本
需求说明
你有两个XML文件:
- hostids.xml:存储host id与对应名称的映射
- resources.xml:需要替换其中
<host>元素的文本内容,替换为hostids.xml中对应id的名称
解决方案
我们可以用XSLT的document()函数加载外部的hostids.xml,通过@id属性进行匹配,替换目标文本。以下是完整的XSLT代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 复制所有节点和属性,保留原XML结构 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 专门匹配需要替换文本的<host>元素 --> <xsl:template match="host"> <host id="{@id}"> <!-- 从hostids.xml中获取对应id的名称,无匹配时保留原文本 --> <xsl:value-of select="document('hostids.xml')//hostid[@id=current()/@id]/text() | text()"/> </host> </xsl:template> </xsl:stylesheet>
代码细节解释
- 默认复制模板:
match="@*|node()"的模板负责原样复制所有不需要修改的节点和属性,确保XML的整体结构不会被破坏。 - host元素匹配逻辑:专门针对
<host>元素编写模板,重新生成该元素并保留原@id属性。 - 值替换规则:
document('hostids.xml')//hostid[@id=current()/@id]/text()会加载hostids.xml,找到与当前host元素@id完全匹配的hostid元素,取出其文本内容;如果找不到对应id,| text()会保留原文本作为备选方案。
示例效果展示
输入文件(resources.xml)
<?xml version="1.0" encoding="UTF-8"?> <resources> <resource> <host id="001">jaffar 123</host> </resource> <resource> <host id="002">school 234</host> </resource> </resources>
转换后输出结果
<?xml version="1.0" encoding="UTF-8"?> <resources> <resource> <host id="001">Agent</host> </resource> <resource> <host id="002">test2</host> </resource> </resources>
注意事项
- 确保hostids.xml和XSLT文件在同一目录下,若不在同一目录,需在
document()函数中填写完整的文件路径。 - 该方案基于XSLT 1.0,几乎所有主流XSLT处理器(如Saxon、Xalan等)都支持。
内容的提问来源于stack exchange,提问作者jaffar ali
相关产品推荐
相关产品推荐

