2012-03-06 35 views
2

node-set変数としてnode-in変数の属性に現れる文字列がノード値に含まれているかどうかをチェックします。Xpath "contains"関数で変数node-setを使用する方法

<xsl:variable name="Var"> 
<root> 
    <tag atr="x3"> some string <tag> 
    <tag atr="x4"> some string <tag> 
<root> 
<xsl:variable> 

XMLが含まれています

<name>one x3 two<name> 

私が何かしようとしました:

<xsl:value-of select="contains(name,msxsl:node-set($Var)/root/tag/@atr)"/> 

をそれだけで、出力の何もして移動します。

+0

'contains()'は文字列引数を受け入れるので、ノードセットに渡すことはできません。ノードセット内のすべてのアイテムに対して個別にチェックする必要があります。答えのために –

答えて

3

関数または演算子が文字列を受け取ってノード集合を渡す場合、ノード集合の最初の(文書順の)ノードの文字列値のみが生成され、この関数または演算子によって使用されます。

したがって、例えば式:の文字列値をmsxsl:node-set($Var)/root/tag/@atrノードの第が最初nameノードの文字列値に含まれているかどうかだけ

contains(name, msxsl:node-set($Var)/root/tag/@atr) 

試験。

は、あなたが実際にmsxsl:node-set($Var)/root/tag/@atr内のノードのいずれかのの文字列値がnameという名前の特定の要素の文字列値に含まれているかどうかを確認したいです。

$nameが正確要素 nameを含むように定義されて
boolean(msxsl:node-set($Var)/root/tag/@atr[contains($name, .)]) 

:この条件を評価

一つの正しいXPath式。

完全なコード例

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:variable name="name" select="'x42'"/> 

<xsl:variable name="Var"> 
    <root> 
    <tag atr="x3"> some string </tag> 
    <tag atr="x4"> some string </tag> 
    </root> 
</xsl:variable> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "boolean(msxsl:node-set($Var) 
       /root/tag/@atr[contains($name, .)])"/> 
</xsl:template> 
</xsl:stylesheet> 

この変換は、(使用されない)任意のXML文書に適用される場合、所望の、正しい結果がが生成される:

true 

しかし、上記の変換で代入すると、別の答えである(Siva Charan製)のXPath式:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:variable name="name" select="'x42'"/> 

<xsl:variable name="Var"> 
    <root> 
    <tag atr="x3"> some string </tag> 
    <tag atr="x4"> some string </tag> 
    </root> 
</xsl:variable> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "contains(name, msxsl:node-set($Var)/root/tag/@atr)"/> 
</xsl:template> 
</xsl:stylesheet> 

この変換は、間違った答え生成します。それだけですべてのattr属性の最初の封じ込めのためにテストするため

false 

を。

+0

ありがとう。私は受け入れを変更しました:) – Leiru

+0

@ user1252505:どうぞよろしくお願いいたします。 –

関連する問題