我需要一个XPath表达式来查找具有特定数量,类型和子顺序的节点。例如。我们需要一个expr
,其中包含三个类型为expr
,LEFT_ASSIGN
和expr
的子项,按此顺序排列:
//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><-</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><-</LEFT_ASSIGN>
<expr>
<NUM_CONST>42</NUM_CONST>
</expr>
</expr>
</exprlist>
答案 0 :(得分:2)
XPath中写*[1][name()='expr']
的惯用方法是*[1][self::expr]
。
//expr[count(child::*)=3]
可以缩短为//expr[count(*)=3]
。
SYMBOL[count(child::*)=0]
通常写为SYMBOL[not(*)]
。