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

如何在XSL中存储XPath到变量并调用?求助解决访问失败问题

问题解决:动态调用存储在变量中的XPath表达式

你当前的问题核心是:把XML中<Path>节点的文本(一个XPath表达式)存到变量后,无法直接将变量当作XPath路径使用。这是因为XSLT不会自动将字符串形式的XPath解析为可执行的节点选择表达式,必须通过动态评估的方式处理。

以下分XSLT版本给出解决方案:


方案1:XSLT 1.0(使用EXSLT扩展)

XSLT 1.0本身不支持动态执行XPath,需要借助EXSLT的dyn:evaluate()扩展函数(需处理器支持,如Xalan、Saxon)。

修改后的XSL代码示例

<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:dyn="http://exslt.org/dynamic"
                extension-element-prefixes="dyn">

  <!-- 提取Path节点的文本字符串(即目标XPath表达式) -->
  <xsl:variable name="MyPathStr" select="string(//Variable/Path)"/>

  <!-- 用dyn:evaluate动态执行拼接后的XPath -->
  <xsl:value-of select="dyn:evaluate(
    concat(
      $MyPathStr,
      '[Index_on_line_section = ', current()/@VARIANT_RANK, ' and Line_section_id = ', current()/@LC_ID, ']/../../Id'
    )
  )"/>

</xsl:stylesheet>

方案2:XSLT 2.0及以上(原生支持动态评估)

XSLT 2.0+提供了原生的evaluate()函数(或xsl:evaluate指令),可以安全地动态执行字符串形式的XPath,还支持参数传递避免字符串拼接风险。

修改后的XSL代码示例

<xsl:stylesheet version="2.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- 提取Path节点的文本字符串 -->
  <xsl:variable name="MyPathStr" select="string(//Variable/Path)"/>

  <!-- 构造带参数的目标XPath字符串 -->
  <xsl:variable name="targetXPath" select="concat(
    $MyPathStr,
    '[Index_on_line_section = $variantRank and Line_section_id = $lcId]/../../Id'
  )"/>

  <!-- 传递参数并执行动态XPath -->
  <xsl:value-of select="evaluate(
    $targetXPath,
    map{
      'variantRank': current()/@VARIANT_RANK,
      'lcId': current()/@LC_ID
    }
  )"/>

</xsl:stylesheet>

关键说明

  • 你原代码中$MyPath指向的是<Path>元素节点,而非节点的文本内容,需要用string()提取XPath字符串。
  • 动态评估XPath需要确保处理器支持对应功能:XSLT1.0需启用EXSLT扩展,XSLT2.0+直接使用原生函数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 14:21:22