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

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>

我希望一次性获取它,怎么做呢?

2个回答

3
当你使用current()时,它的作用与.相同(参见第12.4节)。然而,current的目的(广义上)是能够从谓词中获取整个表达式的上下文节点(其中.代表谓词的上下文)。
我想这种区别的微妙之处可能会导致一些困惑。
如果整个表达式的上下文节点的字符串值与$thisProduct相同,则此XPath表达式将成功。显然,这不是你想要的:
$ChildList[string(current())=string($thisProduct)]

如果$ChildList中有一个节点与$thisProduct具有相同的字符串值,那么此表达式将成功。
$ChildList[string(.)=string($thisProduct)]

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

2

用途:

$thisProduct = $ChildList

如果thisProduct被定义为包含某个原子值(在XPath 2.0中不是节点集或序列),而$ChildList是一个节点集(或者在XPath 2.0中是一个序列),那么上述XPath表达式的求值结果仅当$ChildList中存在一个节点(或在XPath 2.0中的一项),其字符串值等于$thisProduct的字符串值时,才会返回true()
您可以在任何XSLT条件指令(xsl:ifxsl:when)的test属性中使用这个简短的表达式,也可以在任何xsl:template指令的匹配模式(match属性)中使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接