能否从节点路径获取属性值?求解析指定XSL代码功能
拆解你的XSL代码逻辑 & 属性值输出问题
让我一步步帮你理清这行代码的工作原理,顺便解答你的属性值输出疑问:
1. 逐部分解析 <xsl:value-of select="/product/price[contains($name, @name)]/@poz" />
这行代码的核心是用<xsl:value-of>输出指定选中项的值,我们拆成三段看:
/product/price:这是XPath路径,从XML文档的根节点开始,定位到所有<product>节点下的直接子节点<price>。简单说就是先把所有<price>节点捞出来。[contains($name, @name)]:这是XPath谓词(过滤条件),用来筛选上面捞出来的<price>节点:$name是你定义的XSL变量,里面存了一个字符串;@name是当前<price>节点的name属性值;contains(A,B)的作用是检查字符串A是否包含字符串B,所以这里的逻辑是:只保留那些<price>节点的name属性值,是变量$name值的子串的节点。
注意:这里很容易踩坑——如果你的实际需求是检查
$name是否包含在@name里,那参数顺序要反过来写成contains(@name, $name),别搞反了!/@poz:最后定位到符合过滤条件的<price>节点的poz属性,<xsl:value-of>会输出这个属性的具体值。
举个实际例子,如果你的XML是这样:
<product> <price name="summer_sale" poz="50">199</price> <price name="winter_clearance" poz="70">99</price> </product>
假设$name的值是summer,那contains("summer", "summer_sale")会返回false(因为"summer"里没有"summer_sale"),这行代码不会输出任何内容;如果$name是summer_sale,那过滤条件成立,会输出50。
2. 关于“从节点路径显示属性值”的疑问
当然可以!这正是你这行代码正在做的事情😉。在XPath里,要获取节点的属性值,只需要在节点路径后面加上@属性名即可,比如:
- 要获取单个
<price>节点的poz属性:/product/price[1]/@poz - 要获取所有
<price>节点的poz属性(XSLT 2.0+支持批量输出):/product/price/@poz
然后用<xsl:value-of>就能直接输出这些属性的值了。
内容的提问来源于stack exchange,提问作者Smile
相关产品推荐
相关产品推荐

