XSLT:检查节点列表中是否找到节点

时间:2011-12-23 12:01:21

标签: xml xslt xpath xslt-2.0 xpath-2.0

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

现在我正在使用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>

我想一次性拍摄。我怎么能?

2 个答案:

答案 0 :(得分:3)

以您使用它的方式使用时,current().相同(请参阅12.4部分)。但是,current(广泛地说)的目的是能够从谓词中获取整个表达式的上下文节点(其中.表示谓词的上下文)。

我认为这种区别的微妙之处可能会造成一些混乱。

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

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

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

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

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

答案 1 :(得分:2)

使用

$thisProduct = $ChildList

如果thisProduct被定义为包含一些原子值(不是XPath 2.0中的节点集或序列),$ChildList是节点集(或XPath 2.0中的序列)然后,当true()中的字符串值等于字符串值$ChildList的节点(或XPath 2.0中的项)时,上述XPath表达式的计算结果为$thisProduct

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