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

XSLT转换技术问询:复制XML并完成指定节点修改

修正后的XSL代码及问题说明

首先,我先明确你的核心需求:

  • 完整复制输入XML的所有内容,但要排除<CTO/PT/address>节点;
  • 为每个<OLS/OL>节点下的<PT/addressId>填充对应数据:通过<OL>的<id>值,匹配<output_getquerydata>里query参数的id,再把对应results中的address值填入。

原XSL的问题点

你提到的获取OL id的变量路径错误,大概率是引用<OL>的<id>时,使用了错误的相对路径或上下文节点,导致无法正确匹配<output_getquerydata>中的对应数据。

修正后的XSL代码

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 身份模板:默认复制所有节点和属性 -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- 排除CTO/PT/address节点 -->
    <xsl:template match="CTO/PT/address"/>

    <!-- 处理OLS/OL/PT/addressId节点,填充匹配的address值 -->
    <xsl:template match="OLS/OL/PT/addressId">
        <xsl:variable name="current-ol-id" select="../../id"/> <!-- 正确获取当前OL的id -->
        <!-- 匹配output_getquerydata中对应id的result的address -->
        <xsl:copy>
            <xsl:value-of select="/output_getquerydata/query[parameter/@id = $current-ol-id]/results/address"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

关键修正说明

  1. 身份模板:保留默认的节点复制逻辑,确保除了被特殊模板匹配的节点外,其他所有内容都原样复制。
  2. 排除指定节点:通过match="CTO/PT/address"的空模板,直接跳过该节点的复制,实现排除需求。
  3. 正确获取OL的id:处理addressId时,用../../id(从addressId往上两级到OL节点,再取id值)获取当前OL的id,这是核心修正点,确保变量能拿到正确的匹配值。
  4. 匹配对应数据:通过/output_getquerydata/query[parameter/@id = $current-ol-id]/results/address的XPath,精准定位到对应id的query结果中的address值,填充到addressId节点中。

如果你的输入XML结构有细微差异(比如output_getquerydata的层级不同),可以根据实际结构调整XPath路径,核心逻辑就是先正确获取OL的id,再进行匹配。

内容的提问来源于stack exchange,提问作者user3529643

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:05:40