在XPath 1.0中,如果某個函數或運算符期望一個字符串並且傳遞了一個節點集,則該節點集的第一個(按文檔順序)節點的字符串值僅由該函數或運算符。
因此,表達如:的msxsl:node-set($Var)/root/tag/@atr
節點的第一字符串值僅
contains(name, msxsl:node-set($Var)/root/tag/@atr)
測試是否被包含在所述第一name
節點的字符串值。
實際上,你想看看的在msxsl:node-set($Var)/root/tag/@atr
節點的任何字符串值包含在一個給定的元素,命名爲name
的字符串值。
一個正確的XPath表達式評估此條件:
boolean(msxsl:node-set($Var)/root/tag/@atr[contains($name, .)])
其中$name
被定義爲包含完全元件name
。
完善的代碼示例:
<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>
這種轉變會產生錯誤的答案:
false
,因爲它僅用於封閉測試首先attr
屬性。
'contains()'接受字符串參數,所以你不能將它傳遞給一個nodeset。您需要單獨檢查nodeset中的每個項目。 – 2012-03-06 18:44:18