Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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
Xml 递归XPath的条件_Xml_Xpath_Recursive Regex - Fatal编程技术网

Xml 递归XPath的条件

Xml 递归XPath的条件,xml,xpath,recursive-regex,Xml,Xpath,Recursive Regex,如何在XPath中使用递归和条件选择 例如,鉴于本文件: <root xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org"> <file name="foo.mp4"> <chunks> <file> <chunks> <file> <chunks>

如何在XPath中使用递归和条件选择

例如,鉴于本文件:

<root xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org">
  <file name="foo.mp4">
    <chunks>
      <file>
        <chunks>
          <file>
          <chunks>
            <file>1</file>
            <file>2</file>
            <file>3</file>
            <file>4</file>
          </chunks>
          </file>
          <file>
          <chunks>
            <file>5</file>
            <file>6</file>
            <file>7</file>
            <file>8</file>
          </chunks>
          </file>
        </chunks>
      </file>
      <file>
        <chunks>
          <file>
          <chunks>
            <file>9</file>
            <file>10</file>
            <file>11</file>
            <file>12</file>
          </chunks>
          </file>
          <file>
          <chunks>
            <file>13</file>
            <file>14</file>
            <file>15</file>
            <file>16</file>
          </chunks>
          </file>
        </chunks>
      </file>
    </chunks>
  </file>
</root>
但是采用了一种通用的方法,即覆盖更深层嵌套对象的方法。大概是这样的:

//[name="foo.mp4"]/(chunks/*[1]/)+/*

cond+不是XPath语法,而是我想要的类似正则表达式的表示形式

递归意味着自引用,在XPath中不直接可用。忽略元素的中间级别的常用方法是通过子体或自轴//,由所需的属性锚定

例如,以下每个XPath表达式

值小于5的所有文件元素:

其祖先没有前辈的文件叶元素:

将选择


根据要求。

据我所知,没有递归XPath。因此,您需要将XPath与XSLT或编程语言等其他东西结合起来,才能执行递归。如果可能的话,使用纯XPath,您需要以不同的方式表述需求

我不知道这是否适用于您的实际数据,但您是否可以制定如下要求,例如:

在文件[@name='foo.mp4']中,找到第一个包含叶元素的元素,即不包含任何元素的元素,只包含文本节点,然后返回叶元素

然后将有一个可能的纯XPath解决方案:

(//file[@name='foo.mp4']//chunks[not(file/*)])[1]/file

给定所讨论的示例XML,在测试时,文件1到4的预期输出由上述XPath表达式返回。

对不起,这是一个非常糟糕的需求声明。你的意思是,如果输入是17,那么我希望答案是23,但我希望这可以推广到任何输入。您需要为我们提供计算输入输出的一般规则;我们不能从一个例子中推断出来。
//[name="foo.mp4"]/(chunks/*[1]/)+/*
//file[number() < 5]
//file[not(*)][count(preceding::file[not(*)]) < 4]
//file[not(*)][not(ancestor::*[preceding::*])]
<file>1</file>
<file>2</file>
<file>3</file>
<file>4</file>
(//file[@name='foo.mp4']//chunks[not(file/*)])[1]/file