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

