関数または演算子が文字列を受け取ってノード集合を渡す場合、ノード集合の最初の(文書順の)ノードの文字列値のみが生成され、この関数または演算子によって使用されます。
したがって、例えば式:の文字列値を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
を。
'contains()'は文字列引数を受け入れるので、ノードセットに渡すことはできません。ノードセット内のすべてのアイテムに対して個別にチェックする必要があります。答えのために –