2016-07-13 41 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]'。 –

相关问题