2011-01-07 88 views
2

我試圖找出一個XPath查詢字符串來執行以下操作。相對XPath查詢迭代'級'

由於XML文檔是這樣的:

<root> 
    <data>foo1</data> 
    <irrelevant-node> 
     <data>foo1</data> 
    </irrelevant-node> 
    <irrelevant-node /> 
    <data>foo2</data> 
    <irrelevant-node /> 
    <region> 
     <data>bar1</data> 
     <data>bar2</data> 
     <irrelevant-node /> 
     <region> 
      <data>hello1</data> 
      <irrelevant-node /> 
      <data>hello2</data> 
      <region> 
       <irrelevant-node /> 
       <data>world1</data> 
      </region> 
     </region> 
     <irrelevant-node /> 
     <data>bar3</data> 
     <irrelevant-node> 
      <data>foo1</data> 
     </irrelevant-node> 
     <irrelevant-node /> 
    </region> 
    <irrelevant-node /> 
</root> 

我想抓住所有未包含在<region><data>節點。

然後,我想抓住所有最上面的<region>節點並重覆上面的過程,相對地工作。

本質上,我將根據其內容在<data>節點上執行多個進程(PHP),然後替換它們。但是,<region>節點充當範圍分隔符,並且一旦完成處理給定範圍內的所有<data>節點,我將向下移動一個區域級別。 <data>節點可以嵌套在其他不相關節點中。

不確定XPath是否是最好的工具,而且在解決這個問題時遇到了很多麻煩。如前所述,我正在使用DOM類的PHP實現。

+0

在第二次迭代中還應該使用「bar ...」data來選擇/ root/region /無關節點/數據? – 2011-01-07 20:13:39

+0

** @亞歷杭德羅**:這是正確的。第一次迭代應該捕獲所有'foo`數據。第二個,「酒吧」。第三個`hello`,等等。 – Dan 2011-01-07 20:31:53

回答

3

本質上講,我將是 執行數量的進程(PHP) 根據自己 內容的節點上,然後替換它們。 然而,節點作爲分隔符範圍的一種 ,一旦我完成 處理在一個給定的 範圍內的所有節點<data>,我向下移動一個區域級。 <data>節點可以嵌套在其他不相關的節點內。

使用

//data[count(ancestor::region) = $n] 

其中$n是0,1,...,最大深度。

對於每個$ n的值,表達式選擇「level $ n」處的所有data元素。

可以找到「最大深度」作爲最大的count(ancestor::region)+1每個節點中的選擇的條件:

//region[not(descendant::region)] 

該最大可以在一個XPath來指定2.0表達,但不包含單個XPath 1.0表達式。