我正在研究XSLT样式表。我有一个带有一堆子节点的节点(节点A),我正在循环遍历另一个节点(节点B)的子节点。每次节点B的子节点也是节点A的子节点时,我都会尝试做某事,所以我有这个代码:
<xsl:if test="$prodbins/bin[./text()=/root/Line[1]/Element[6]/text()]">
但是这不起作用(测试失败;表达式返回false),即使表达式的左侧和右侧在单独计算时是相等的。
但是当我这样做时:
<xsl:variable name="curbin" select="/root/Line[1]/Element[6]/text()"/>
<xsl:if test="$prodbins/bin[./text()=$curbin]">
表达式的计算结果为true。为什么我必须使用$ curbin变量来获得我期望的结果?
答案 0 :(得分:2)
你可以尝试<xsl:if test="$prodbins/bin[./text()=current()/root/Line[1]/Element[6]/text()]">
(注意current()函数)。它在原始表达式中不起作用的原因是因为您查询变量并且/
查找变量内容的根节点而不是您正在转换的源文档。 current()应返回您所在模板的上下文元素。
答案 1 :(得分:1)
我的猜测是$prodbins/bin
是属于不同文档的节点(-set),而不是包含与进行比较的节点的文档。
在表达式中:
$prodbins/bin[./text()=/root/Line[1]/Element[6]/text()]
子表达式
/root/Line[1]/Element[6]/text()
从相同的文档中选择与从中选择$prodbins/bin
节点的文档相同的文档。
成功指定所需比较的一种方法是:
<xsl:variable name="vDoc" select="/"/>
<xsl:if test="$prodbins/bin[./text()=$vDoc/root/Line[1]/Element[6]/text()]">