2016-07-13 42 views
2

我需要一個XPath表達式來查找具有特定數字,類型和子級順序的節點。例如。我們需要一個expr有三個孩子的類型exprLEFT_ASSIGNexpr,順序如下:XPath:第一個孩子,但只有在特定標記

//expr[count(child::*)=3] 
    [*[1][name()='expr'] 
    [*[2][name()='LEFT_ASSIGN'] 
    [*[3][name()='expr'] 

這工作,但它是相當繁瑣的編寫,特別是因爲我常常需要嵌入類似條件相互轉化。例如。我需要指定第一expr以上兒童也有一組特定的孩子,等:

//expr[count(child::*)=3] 
    [*[1][name()='expr'][count(child::*)=1][SYMBOL[count(child::*)=0]]] 
    [*[2][name()='LEFT_ASSIGN']] 
    [*[3][name()='expr']] 

是否有一個更短的,更簡單的方法?

下面是一些樣本數據:

<?xml version="1.0" encoding="UTF-8"standalone="yes" ?> 
<exprlist> 
    <expr> 
    <expr> 
     <SYMBOL>X</SYMBOL> 
    </expr> 
    <LEFT_ASSIGN>&lt;-</LEFT_ASSIGN> 
    <expr> 
     <expr> 
     <NUM_CONST>42</NUM_CONST> 
     </expr> 
     <OP-STAR>*</OP-STAR> 
     <expr> 
     <NUM_CONST>42</NUM_CONST> 
     </expr> 
    </expr> 
    </expr> 
    <OP-SEMICOLON>;</OP-SEMICOLON> 
    <expr> 
    <expr> 
     <SYMBOL>Y</SYMBOL> 
    </expr> 
    <LEFT_ASSIGN>&lt;-</LEFT_ASSIGN> 
    <expr> 
     <NUM_CONST>42</NUM_CONST> 
    </expr> 
    </expr> 
</exprlist> 

回答

2

XPath中的慣用方式來寫*[1][name()='expr']*[1][self::expr]

//expr[count(child::*)=3]可縮寫爲//expr[count(*)=3]

SYMBOL[count(child::*)=0]通常寫爲SYMBOL[not(*)]

+0

謝謝,這些都很有幫助!順便說一句。我想沒有辦法簡單地告訴XPath只是在指定子節點時考慮子節點的順序,而且需要編寫'* [1] [self :: expr]'。 –

相關問題