2

我正在研究 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]">

该表达式的计算结果为真。为什么我必须使用 $curbin 变量来获得我期望的结果?

4

2 回答 2

2

你能试试吗<xsl:if test="$prodbins/bin[./text()=current()/root/Line[1]/Element[6]/text()]">(注意 current() 函数)。它在您的原始表达式中不起作用的原因是因为您查询一个变量并/查找变量内容的根节点,而不是您正在转换的源文档。current() 应该返回您所在模板的上下文元素。

于 2012-11-21T18:58:16.637 回答
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()]">
于 2012-11-21T19:32:08.240 回答