如何在XSLT 1.0中从XML变量提取指定条目值?
解决XSLT中变量作为字典查询的问题
针对xsltproc(XSLT 1.0)
你定义的$mydict是结果树片段,并非可直接查询的节点集,所以XPath无法直接作用于它。需借助EXSLT的node-set()函数将其转换为节点集,步骤如下:
- 在XSLT根元素中声明EXSLT命名空间及扩展前缀:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl">
- 转换变量并执行查询:
<!-- 假设你有一个值为"c"的变量 --> <xsl:variable name="target-key" select="'c'"/> <!-- 将结果树片段转为节点集 --> <xsl:variable name="mydict-nodes" select="exsl:node-set($mydict)"/> <!-- 查询对应value值 --> <xsl:value-of select="$mydict-nodes/dict/entry[@name=$target-key]/@value"/>
注意:你之前的写法$mydict//entry[@name="$c"]错误在于把变量$c放在了引号里,这会被当作字符串"$c"而非变量引用,正确写法是@name=$target-key。
针对最新版Saxon(XSLT 2.0+)
XSLT 2.0及以上版本中,结果树片段会自动被视为节点集,无需额外转换:
<xsl:variable name="target-key" select="'c'"/> <!-- 直接查询即可 --> <xsl:value-of select="$mydict/dict/entry[@name=$target-key]/@value"/>
如果使用XSLT 3.0,还可以直接将变量定义为原生字典(map),查询更高效简洁:
<xsl:variable name="mydict" as="map(xs:string, xs:string)" select="map { 'a': '1', 'b': '2', 'c': '3', 'd': '4' }"/> <!-- 直接通过键查询值 --> <xsl:value-of select="$mydict('c')"/>
内容的提问来源于stack exchange,提问作者peterh
相关产品推荐
相关产品推荐

