2011-04-10 55 views
2

因此,我不知道如何真正地說出這個問題。我想要一個節點列表,只選擇一個節點,而不是嵌套節點。例如:抓取不是其他節點的後代的節點,不包括當前上下文

<root> 
    <my_element> 
     <my_element> 
      Some Text 
     </my_element> 
    </my_element> 
</root> 

我知道我可以使用此XPath已經做了一些我想要的東西:

Context:/
xPath: descendant::my_element[not(ancestor::my_element)] 

這將返回此結果集:

<root> 
    [<my_element>] 
     <my_element> 
      Some Text 
     </my_element> 
    [</my_element>] 
</root> 

這就是預期我想要的行爲。但我希望能夠改變的背景下:

/my_element 

而得到這樣的結果集:

<root> 
    <my_element> 
     [<my_element>] 
      Some Text 
     [</my_element>] 
    </my_element> 
</root> 

我已經盡我所能在看着XPATH文件,我還沒有想出與很多東西。在這裏冒充某人可以提供一些見解?

謝謝!

  • 編輯 - 我希望能夠選擇一個my_element後裔這是不my_element不包括上下文節點的祖先。

  • 再次編輯 - 爲了進一步解釋。

我想有一個XPath查詢選擇的my_element節點,只要節點不是my_element一個孩子。但是,如果xpath上下文設置爲my_element節點,那麼我不希望該節點在表達式中計數。因此xpath將與下一個my_element節點匹配,即使它實際上是my_element的子節點。再次

  • 編輯 -

下面是更多的例子。

<root> 
    <a> 
     <a> 
      <b> 
       <a> 
        Hello! 
       </a> 
      </b> 
      <a> 
       <b> 
        Hello Again 
        <a> 
         Sub 
        </a> 
       </b> 
      </a> 
     </a> 
    </a> 
</root> 

Context: /root/ 
Desire: Want to grab all A nodes, so long as they aren't a descendant of A 

Result: 
<root> == Context 
    [<a>] 
     <a> 
      <b> 
       <a> 
        Hello! 
       </a> 
      </b> 
      <a> 
       <b> 
        Hello Again 
        <a> 
         Sub 
        </a> 
       </b> 
      </a> 
     </a> 
    [</a>] 
</root> 

Context: /root/a/ 
Desire: Want to grab all A nodes, so long as they aren't a descendant of A, not including the context /root/a/ 

Result: 
<root> 
    <a> == Context 
     [<a>] 
      <b> 
       <a> 
        Hello! 
       </a> 
      </b> 
      <a> 
       <b> 
        Hello Again 
        <a> 
         Sub 
        </a> 
       </b> 
      </a> 
     [</a>] 
    </a> 
</root> 

Context: /root/a/a/ 
Desire: Want to grab all A nodes, so long as they aren't a descendant of A, not including the context /root/a/a/ 

Result: 
<root> 
    <a> 
     <a> == Context 
      <b> 
       [<a>] 
        Hello! 
       [</a>] 
      </b> 
      [<a>] 
       <b> 
        Hello Again 
        <a> 
         Sub 
        </a> 
       </b> 
      [</a>] 
     </a> 
    </a> 
</root> 

Context: /root/a/a/a/ 
Desire: Want to grab all A nodes, so long as they aren't a descendant of A, not including the context /root/a/a/a/ 

Result: 
<root> 
    <a> 
     <a> 
      <b> 
       <a> 
        Hello! 
       </a> 
      </b> 
      <a> == Context 
       <b> 
        Hello Again 
        [<a>] 
         Sub 
        [</a>] 
       </b> 
      </a> 
     </a> 
    </a> 
</root> 

我希望這能讓我的慾望更清晰。謝謝大家誰正在嘗試!

+0

@凱爾:那不就是'my_element'孩子嗎?除非你想要一個'my_element'後代,它沒有'my_element'祖先,排除了上下文節點及其祖先。 – 2011-04-10 21:55:10

+0

你的後者是正確的。我希望能夠選擇my_element後代,它不是my_element的祖先,不包括上下文節點。 – Kyle 2011-04-10 22:41:42

+0

@凱爾:我認爲你不能在XPath 1.0中因爲需要引用上下文節點。 – 2011-04-10 22:56:32

回答

0

使用

//my_element[not(.//my_element)] 

這將選擇命名爲my_element所有元素沒有任何my_element後代。

+0

這不會選擇'root'作爲上下文節點的最外層'my_element'。 – 2011-04-11 20:23:43

+0

@Alejandro:對不起,你能解釋一下嗎? OP希望:「我希望能夠選擇my_element後代不是my_element的祖先,排除了上下文節點」 - 這就是我的答案中的XPath表達式所選擇的內容。 ??? – 2011-04-11 23:21:26

+0

不完全。看,那可以工作,除了我想從測試中排除上下文節點,這可以通過my_element。其實,再讀一遍你的東西,你完全錯了我想要的東西。沒問題。看到這個xpath:descendant :: my_element [not(ancestor :: my_element)]。這很好。除了將xpath上下文設置爲my_element時,在這種情況下,我不希望xpath表達式關心父級(上下文節點)。所以像這樣的東西會起作用,如果它是真正有效的xpath:descendant :: my_element [不是(ancestor :: my_element)除了上下文] – Kyle 2011-04-12 02:43:40

0

我想你可能會陷入一個共同的陷阱。數據上的XPath表達式/ root/my_element將只選擇一個元素 - 最外層的my_element節點。但是這個節點仍然依附於其父母,兄弟姐妹和孩子。當顯示選擇結果時,節點通常會與其子節點(實際上是所有子節點)一起顯示 - 這不是因爲XPath選擇了子節點,而是因爲這是顯示所選單節點的一種友好方式。

另一方面,我再次閱讀了這個問題,而且我可能錯了 - 我從你用來顯示XPath表達式的結果的特殊符號猜測出來。

表達式/ my_element只有在其父項是樹根的文檔節點時纔會選擇my_element,無論您的上下文節點如何,您的輸入都不會出現這種情況。當然,您可以將以my_element爲根的子樹複製到新文檔中,在這種情況下,此表達式將起作用。

+1

OP正在向XPath 2.0表達式請求一個XPath 1.0等效表達式'.//my_element,除了.// my_element // my_element' – 2011-04-11 20:48:55

相關問題