2011-09-28 84 views
14

我已經看到了基於節點值應用了以下兄弟節點的問題,但我的問題與實際節點本身有關。Xpath/XSLT:檢查以下兄弟節點是否是特定節點

這是我必須有XML類型:

<Employee> 
    <Summary> 
     <A> 
     <B> 
    </Summary> 
    <Elections> 
    </Elections> 
<Employee> 

我需要如下寫的Xpath條件:

if (NOT(the following sibling(first sibling) of /Employee/Summary is Elections)), then do something. 

目前我有:

<xsl:if test="(not(following-sibling::Employee/Summary[1]='Earnings')) 
    <xsl:call-template name="EmployeeRecord"/> 
</xsl:if> 

請請注意,我沒有檢查節點值,而是節點本身(即節點名稱)。 任何幫助正確的方向將不勝感激。

+0

什麼是當前節點?概述的條件完全不符合您當前的xslt。你能否用文字說明你在文檔中的位置以及你想要達到的目標? –

回答

28

您正處於正確的軌道上。 following-sibling軸將在上一步中從上下文節點進行評估。

  • ,如果你正在尋找是/Employee/Summary以下同胞的第一個元素,可以使用:/Employee/Summary/following-sibling::*[1]

  • 爲了評估第一個後續兄弟是否是Elections元素,可以使用額外的謂詞過濾器[self::Elections]

  • 測試爲的否定,包住整個事情not()

全部放在一起,調整你的例子:

<xsl:if test="not(/Employee/Summary/following-sibling::*[1][self::Elections])"> 
    <xsl:call-template name="EmployeeRecord"/> 
</xsl:if> 
+1

我以前沒見過'self'部分,所以對於像我這樣的其他人來說,命名空間(ns)就是:'[self :: ns:Elections]' – BurnsBA

3

我需要如下寫的Xpath條件:

if (NOT(the following sibling(first sibling) of /Employee/Summary is Elections)), then do something. 

使用

not(/Employee/Summary/following-sibling::*[1][self::Elections]) 

被指定爲參數傳遞給not()函數中的XPath表達式選擇任何Elections元件,其任何Summary元件,其所述頂部元件Employee的孩子的第一以下-同級元素。

如果這不選擇任何節點,則上面的XPath表達式計算爲true()

相關問題