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

求助:XPATH实现同Request节点内SourceText值复制到TargetText

问题分析与解决方案

嘿,这个问题我之前也踩过类似的坑!问题出在你用的preceding::SourceText轴上——它会匹配文档顺序中当前节点之前所有的SourceText节点,所以第二个TargetText节点找到的是第一个<Request>里的SourceText,自然两个都被填成了Text 1。

要解决这个问题,你需要精准定位到当前TargetText所在的同一个<Request>节点下的SourceText,用相对路径或者祖先轴来限定范围,而不是全局查找前面的节点。

修正后的XSLT代码

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <!-- identity transform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="TargetText">
    <TargetText> <!-- 这里纠正了你原代码里的笔误:你写成了ResponseText,但预期结果里是TargetText -->
      <xsl:value-of select="ancestor::Request[1]/RequestArea/SourceText"/>
    </TargetText>
  </xsl:template>
</xsl:stylesheet>

关键说明

  1. ancestor::Request[1]:找到当前节点最近的<Request>祖先节点,确保我们只在同一个<Request>范围内查找SourceText,不会跨节点匹配。
  2. 你也可以用相对路径替代,效果完全一致:../../RequestArea/SourceText(路径逻辑:TargetText → ResponseArea → Request → RequestArea → SourceText),但ancestor轴的写法更清晰,尤其是当XML结构层级有变化时,健壮性更强。
  3. 顺便提一句:你原代码里把TargetText节点替换成了ResponseText,但你的预期XML里还是保留TargetText,所以我帮你修正了这个小细节,如果确实需要改名可以再调整。

这样修改后,MSXSL执行时就会把每个<Request>里的SourceText值准确复制到同节点的TargetText中,完全符合你的预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:24:12