Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XPath:第一个子项,但仅当特定标记_Xpath - Fatal编程技术网

XPath:第一个子项,但仅当特定标记

XPath:第一个子项,但仅当特定标记,xpath,Xpath,我需要一个XPath表达式来查找具有特定数量、类型和子节点顺序的节点。例如,我们需要一个expr,它有三个子类型expr、LEFT\u ASSIGN和expr,顺序如下: //expr[count(child::*)=3] [*[1][name()='expr'] [*[2][name()='LEFT_ASSIGN'] [*[3][name()='expr'] 这是可行的,但编写起来相当麻烦,特别是因为我经常需要将相似的条件嵌入彼此。例如,我需要指定上面的第一个expr子级也有一组

我需要一个XPath表达式来查找具有特定数量、类型和子节点顺序的节点。例如,我们需要一个
expr
,它有三个子类型
expr
LEFT\u 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>&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>

X
-
42
*
42
;
Y
-
42

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

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


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

谢谢,这些都很有用!BTW.我想没有办法简单地告诉XPath只考虑子节点在指定时的顺序,并且需要编写<代码> *[1 ] [自我::EXPR] < /代码>。