2012-03-06 35 views
2

我想檢查節點值是否包含一個字符串,該字符串出現在節點集中帶有變量的節點的屬性中。如何在Xpath中使用變量節點集「contains()」函數

<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()'接受字符串參數,所以你不能將它傳遞給一個nodeset。您需要單獨檢查nodeset中的每個項目。 – 2012-03-06 18:44:18

回答

3

在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屬性。

+0

感謝您的回答。我改變了接受:) – Leiru 2012-03-07 11:34:44

+0

@ user1252505:不客氣。 – 2012-03-07 13:30:27

相關問題