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

XSLT 1.0中如何将动态生成的XPath作为select取值

动态执行生成的XPath字符串获取XML节点值

问题背景

动态生成XPath字符串后,直接在<xsl:value-of>的select属性中引用该字符串,输出的是XPath文本本身而非目标节点的值。

示例XML文档

<s0:RootNode>
    <s0:HEADER>
        <s0:DocumentDate>2022-10-13</s0:DocumentDate>
        <s0:DocumentID>123456</s0:DocumentID>
    </s0:HEADER>
</s0:RootNode>

当前动态生成XPath的代码

<!-- 后续该值会动态传入 --> 
<xsl:variable name="varField" select="'DocumentID'"/>
<xsl:variable name="xPath" select="concat('s0:HEADER/s0:',$varField,'/text()')" />

当前映射代码与输出

<Value>
   <xsl:value-of select="$xPath" />
</Value>

输出结果:

<Value>s0:HEADER/s0:DocumentID/text()</Value>

期望输出

<Value>123456</Value>

解决方案

XSLT无法直接将字符串当作XPath表达式执行,需根据使用的XSLT版本选择对应方法:

1. XSLT 2.0及以上版本(推荐,支持动态执行)

使用xsl:evaluate指令执行动态生成的XPath字符串,替换原有的<xsl:value-of>代码:

<Value>
   <xsl:evaluate select="$xPath" context-item="." />
</Value>
  • select:传入动态生成的XPath字符串
  • context-item=".":指定XPath的上下文节点(当前节点,确保路径解析正确)

执行后即可得到期望的123456输出。

2. XSLT 1.0版本(无动态执行支持,换节点匹配思路)

XSLT 1.0不支持xsl:evaluate,可直接通过节点名匹配获取目标值,无需拼接XPath字符串:

<xsl:variable name="varField" select="'DocumentID'"/>
<Value>
   <xsl:value-of select="s0:HEADER/*[local-name()=$varField]/text()" />
</Value>
  • *[local-name()=$varField]:匹配HEADER下本地名称等于$varField的节点
  • 若需更严格匹配命名空间,可改用*[namespace-uri()='命名空间URI' and local-name()=$varField](替换s0对应的实际命名空间URI)

内容的提问来源于stack exchange,提问作者Ronny Drechsler-Hildebrandt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:55:18