You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:41:14