簡體   English   中英

遞歸XPath的條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM