2014-03-28 112 views
0

我試圖從使用XPath的XML輸入中排除一些元素。 在下面的示例中,我需要排除所有「X」元素XPath:按名稱排除元素(遞歸)

我想我只需要使用像//*[not(self::X)]這樣的XPath查詢,但是這似乎不適用於所有平臺。

我試圖在這些2名網站:

http://chris.photobooks.com/xml/default.htm

http://www.freeformatter.com/xpath-tester.html

對於第一之一,XML輸出將如預期(X元素沒有在輸出高亮),但對於第二個,輸出與輸入嚴格相同。不幸的是,將使用此XPath的軟件具有與第二個網站相同的行爲...

其他奇怪的事情:當我嘗試//*[self::X]時,我在兩個站點上都獲得了所有X元素。

你能幫我解答這個簡單的問題嗎?我可能會錯過某些明顯的東西,但我在XPath查詢方面很新穎!謝謝。

樣品:

<ROOTNODE> 
    <ITEM>12345</ITEM> 
    <LEVELS COUNT="1"> 
     <LEVEL> 
      <OFFICES COUNT="3"> 
       <OFFICE> 
        <CODEOFF>21</CODEOFF> 
        <LIB>GALLEY AVANT</LIB> 
        <NIV>1</NIV> 
        <X>6</X> 
        <Y>78</Y> 
        <L>127</L> 
        <H>196</H> 
        <OBJECTS COUNT="7"> 
         <OBJECT> 
          <CODEOBJ>G1C</CODEOBJ> 
          <LIB>GALLEY 1C</LIB> 
          <NIV>1</NIV> 
          <X>12</X> 
          <Y>143</Y> 
          <L>32</L> 
          <H>49</H> 
         </OBJECT> 
         <OBJECT> 
          <CODEOBJ>G1L</CODEOBJ> 
          <LIB>GALLEY 1L</LIB> 
          <NIV>1</NIV> 
          <X>32</X> 
          <Y>205</Y> 
          <L>34</L> 
          <H>29</H> 
         </OBJECT> 
        </OBJECTS> 
       </OFFICE> 
      </OFFICES> 
     </LEVEL> 
    </LEVELS> 
</ROOTNODE> 

回答

2

你不能使用XPath做到這一點。

XPath只能選擇整個子樹,不能修改它們或構造新的結果。無論是需要使用XQuery還是使用某個DOM接口來選擇和刪除<X/>元素(可以使用XPath查詢//X查找)。

+0

謝謝Jens,我希望我可以這樣使用它。我將不得不調查,看看我使用的軟件是否可以處理XQuery –

+0

您使用哪一個? –

+0

這是一個名爲Convertigo的移動企業應用平臺 –

0

XPath從輸入文檔的樹表示中選擇節點。如果您願意,可以考慮將指針返回到樹形數據結構中。

無論您用什麼軟件來顯示XPath結果,都必須決定如何顯示這些「指針」。最常見的約定是顯示以選定的節點爲根的整個XML樹。這不是唯一的方法;有些工具更喜歡顯示從根節點到選定節點的路徑。但重要的是從顯示方式(顯示整個子樹或根路徑)中區分XPath正在選擇的節點(節點)。

如果您希望您的輸出包含來自您的輸入的不同XML,那麼您對XPath運氣不佳。爲此,您需要XSLT或XQuery。 XPath嚴格從輸入樹中選擇節點。

+0

感謝Michael的解釋 –