如何在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
相关产品推荐
相关产品推荐

