求助: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>
关键说明
ancestor::Request[1]:找到当前节点最近的<Request>祖先节点,确保我们只在同一个<Request>范围内查找SourceText,不会跨节点匹配。- 你也可以用相对路径替代,效果完全一致:
../../RequestArea/SourceText(路径逻辑:TargetText→ResponseArea→Request→RequestArea→SourceText),但ancestor轴的写法更清晰,尤其是当XML结构层级有变化时,健壮性更强。 - 顺便提一句:你原代码里把
TargetText节点替换成了ResponseText,但你的预期XML里还是保留TargetText,所以我帮你修正了这个小细节,如果确实需要改名可以再调整。
这样修改后,MSXSL执行时就会把每个<Request>里的SourceText值准确复制到同节点的TargetText中,完全符合你的预期结果。
内容的提问来源于stack exchange,提问作者BN_pdx
相关产品推荐
相关产品推荐

