为什么我必须将此节点分配给样式表中的变量?

时间:2012-11-21 17:07:26

标签: xslt

我正在研究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变量来获得我期望的结果?

2 个答案:

答案 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()]">