Xml 递归XPath的条件
如何在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>
<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