2016-07-13 12 views
2

特定の番号、タイプ、および子の順序を持​​つノードを検出するXPath式が必要です。例えば。この作品XPath:最初の子(特定のタグのみの場合)

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

が、多くの場合、私はお互いに同様の条件を埋め込む必要が特にあるため、書き込みするのは非常に面倒です:私たちは、この順に、3種類のexprの子供、LEFT_ASSIGNexprexprを必要としています。例えば。短い、簡単な方法があります

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

:私はまた、上記の最初のexpr子供は子供、などの特定のセットを持っていることを指定する必要がありますか?ここで

は、いくつかのサンプルデータです:*[1][name()='expr']を書くためのXPathで

<?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

慣用的な方法は*[1][self::expr]です。

//expr[count(child::*)=3]//expr[count(*)=3]に短縮することができます。

SYMBOL[count(child::*)=0]は通常SYMBOL[not(*)]と書かれています。

+0

ありがとう、これらは役に立ちます! Btw。私は、単にXPathに指定されているように子ノードの順序を考え、 '* [1] [self :: expr]'を書く必要があることを単に伝える方法はないと思います。 –

関連する問題