XPath:第一个孩子,但仅限于特定标记

时间:2016-07-13 13:10:32

标签: xpath

我需要一个XPath表达式来查找具有特定数量,类型和子顺序的节点。例如。我们需要一个expr,其中包含三个类型为exprLEFT_ASSIGNexpr的子项,按此顺序排列:

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

1 个答案:

答案 0 :(得分:2)

XPath中写*[1][name()='expr']的惯用方法是*[1][self::expr]

//expr[count(child::*)=3]可以缩短为//expr[count(*)=3]

SYMBOL[count(child::*)=0]通常写为SYMBOL[not(*)]