3

我需要检查节点列表中是否存在特定值。

现在我正在使用 for-each ,我认为这效率不高。

<xsl:for-each select="$ChildList">
    <i><xsl:value-of select="current()"></xsl:value-of> and <xsl:value-of select="$thisProduct"></xsl:value-of></i><br/>
    <xsl:if test="string(current())=string($thisProduct)">
        <!--<xsl:variable name="flag" select="1"/>  -->
        <p><b>Found!</b>
</p>
    </xsl:if>
</xsl:for-each>

我想一口气搞定。我怎样才能?

4

2 回答 2

3

当以您使用它的方式使用时,current().(参见第12.4节)相同。但是,current(广义上讲)的目的是能够从谓词中获取整个表达式的上下文节点(其中.表示谓词的上下文)。

我想这种区别的微妙之处可能会引起一些混乱。

只有当整个表达式的上下文节点的字符串值与 $thisProduct 相同时,此 XPath 表达式才会成功。这显然不是你想要的:

$ChildList[string(current())=string($thisProduct)]

$ChildList如果其中存在与 $thisProduct 具有相同字符串值的节点,则此表达式将成功。

$ChildList[string(.)=string($thisProduct)]

即,它查找$ChildList表达式string(.)=string($thisProduct)为真的节点。

于 2011-12-23T12:32:42.343 回答
2

使用

$thisProduct = $ChildList

如果 casethisProduct被定义为包含一些原子值(不是 XPath 2.0 中的节点集或序列),并且$ChildList是节点集(或 XPath 2.0 中的序列),那么上面的 XPath 表达式的计算结果true()恰好是存在节点时(或 XPath 2.0 中的项目),$ChildList其字符串值等于$thisProduct.

test您可以在任何 XSLT 条件指令(xsl:ifxsl:when)的属性或任何指令的匹配模式(match属性)中使用此短表达式xsl:template

于 2011-12-23T13:16:01.493 回答