2011-12-23 105 views
3

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

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

我希望能在一个镜头中得到它。我怎么能够?

回答

3

按照使用方法使用时,current().(请参阅第12.4部分)相同。然而,从广义上讲,current的目的是能够从谓词中获取整个表达式的上下文节点(其中.代表谓词的上下文)。

我想这种区别的微妙可能会造成一些混淆。

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

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

这个表达式会成功。

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

即它看起来通过$ChildList对于其中表达string(.)=string($thisProduct)是真的节点。

+0

非常感谢。这个对我有用。 – Kangkan 2011-12-23 13:33:01

2

使用

$thisProduct = $ChildList 

在壳体thisProduct被定义为包含一些原子值(不是一个节点集合或XPath 2.0中的序列),和$ChildList是一个节点集(或序列在XPath 2.0中),那么当$ChildList的节点(或XPath 2.0中的项目)的字符串值等于字符串值$thisProduct时,上述XPath表达式的计算结果为true()

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

相关问题