[英]Conditions on recursive XPath
如何在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>
我只選擇:
<file>1</file>
<file>2</file>
<file>3</file>
<file>4</file>
因此,有效地做到這一點:
//[name="foo.mp4"]/chunks/*[1]/chunks/*[1]/*
但是采用通用方法-即可以覆蓋更深層嵌套的對象。 像這樣:
//[name="foo.mp4"]/(chunks/*[1]/)+/*
(cond)+
不是XPath語法,而是我想要的正則表達式表示。
遞歸表示自我引用,不能直接在XPath中使用。 忽略元素中間級別的常用方法是通過descendant-or-self
軸( //
),並以所需的屬性為錨。
例如,以下每個XPath表達式,
所有值小於5的file
元素:
//file[number() < 5]
前4個葉子file
元素:
//file[not(*)][count(preceding::file[not(*)]) < 4]
其祖先沒有前任的file
葉元素:
//file[not(*)][not(ancestor::*[preceding::*])]
將選擇
<file>1</file>
<file>2</file>
<file>3</file>
<file>4</file>
按照要求。
據我所知,沒有像遞歸XPath這樣的東西。 因此,您需要將XPath與XSLT或其他編程語言結合起來才能進行遞歸。 使用純XPath,如果可能的話,您需要以不同的方式表述需求。
我不知道這是否適用於您的實際數據,但是例如您是否可以將要求表達為以下內容:
“在
file[@name='foo.mp4']
,找到第一個包含葉子<file>
<chunk>
,即不包含任何元素的<file>
元素,僅包含文本節點,然后返回葉子<file>
元素”
那么可能會有一個純XPath解決方案:
(//file[@name='foo.mp4']//chunks[not(file/*)])[1]/file
給定有問題的示例XML,在here
進行測試時,上述XPath表達式將返回file
1至4的預期輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.