2011-12-23 34 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(広く言えば)の目的は、述語内の式全体のコンテキストノードを得ることができることである(ここで、.は述語のコンテキストを表す)。

私は、この区別の繊細さが混乱を招いたと想像しています。

このXPath式は、式全体のコンテキストノードの文字列値が$ thisProductと同じ場合にのみ成功します。これは、あなたが望むものは明らかではありません。

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

$ thisProductと同じ文字列値を持つ$ChildList内のノードが存在する場合、この式は成功します。

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

すなわちそれが発現string(.)=string($thisProduct)が真であるノードについて$ChildListを通して見えます。

+0

ありがとうございます。わたしにはできる。 – Kangkan

2

使用

場合 thisProduct
$thisProduct = $ChildList 

は、いくつかの原子値(ないノードセットまたはXPath 2.0の中の配列)、及び$ChildListがノードセット(または配列を含むように定義されていますXPath 2.0では)文字列値が文字列値$thisProductと等しい$ChildListにノード(またはXPath 2.0の項目)がある場合は、上記のXPath式はtrue()と正確に評価されます。

あなたはどんなXSLT条件命令(xsl:ifまたはxsl:when)のtest属性または任意のxsl:template命令のマッチパターン(match属性)にこの短い表現を使用することができます。

関連する問題