2011-09-20 31 views
1

示例XML:的Xpath:複雜表達式,包括一些節點和排除他人

<foo> 
    <bar name="bar1"> 
    </bar> 
    <bar name="bar2"> 
    </bar> 
</foo> 
<qux> 
    <foo> 
     <bar name="bar3"> 
     </bar> 
    </foo> 
    <bar name="bar4"> 
    </bar> 
</qux> 

什麼是選擇所有欄元素是根FOO的兒童(BAR1,BAR2,bar4)但不表達嵌套foo(bar3)?

預先感謝您!

+1

那不是合法的XML文檔。有多個根元素。 – Cheeso

+0

bar4不是root foo的孩子。 –

+0

@Michael Kay - 你是對的,根foo應該覆蓋qux元素。請看我對第一個答案的第一個迴應。 – user897210

回答

1

由於@Cheeso說,該文件是無效的,它似乎並沒有與你的問題jive。

如果這是你的意思是文件(其中qux是第一foo內)

<foo> 
    <bar name="bar1"> 
    </bar> 
    <bar name="bar2"> 
    </bar> 
    <qux> 
     <foo> 
      <bar name="bar3"> 
      </bar> 
     </foo> 
     <bar name="bar4"> 
     </bar> 
    </qux> 
</foo> 

那麼這裏有兩個路徑

//bar[not(parent::foo[ancestor::foo])] 
//bar[1 >= count(ancestor::foo)] 

,將選擇您想要的元素(測試。淨)。

+0

謝謝你的迴應!你對xml是正確的。要求是 - 可以有幾層嵌套的foo和bar元素。選擇當前foo的後代而不是任何其他foo的所有bar元素。再次感謝! – user897210

+0

@ user897210,好的,這是更具體。我已經用兩種可能的解決方案更新了答案。取決於你發現更多的可讀性。 – harpo

2

什麼是選擇所有的酒吧元素是 兒童根FOO(BAR1,BAR2,bar4),但不能嵌套FOO(BAR3)的表達?

這裏可能是最簡單和最短的XPath表達式中的一個,當對具有頂部元件foo並且可以具有嵌套foo元件中的任何水平的任何良好的XML文檔進行評估選擇完全bar元件,其僅foo祖先是頂部元件:

//bar[not(ancestor::foo[2])] 

這個XPath表達式,其具有少於兩個foo祖先文檔中選擇任何bar元件。因爲根據定義,頂部元素是foo,這意味着每個bar都具有此頂部元素foo作爲祖先。如果它是一個嵌套foo內,它具有至少一個第二祖先foo,不會通過上述XPath表達式來選擇的,因爲在這種情況下boolean(ancestor::foo[2])true()

XSLT - 基於驗證

這種轉變

當下面的XML文檔應用(基於provi

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "//bar[not(ancestor::foo[2])]"/> 
</xsl:template> 
</xsl:stylesheet> 
DED XML片段,而是使其成爲一個良好的XML文檔,並添加了稍微更多的嵌套/複雜性,使這個有趣的):

<foo> 
    <bar name="bar1"> 
    </bar> 
    <bar name="bar2"> 
    </bar> 
    <qux> 
     <foo> 
      <baz> 
      <bar name="bar3"> 
      </bar> 
      </baz> 
     </foo> 
     <bar name="bar4"> 
     </bar> 
     <qux> 
      <foo> 
       <bar name="bar5"> 
       </bar> 
      </foo> 
      <bar name="bar6"> 
      </bar> 
     </qux> 
    </qux> 
</foo> 

輸出完全想要的元素

<bar name="bar1"> 

</bar> 
<bar name="bar2"> 

</bar> 
<bar name="bar4"> 

</bar> 
<bar name="bar6"> 

</bar> 
+0

+1以獲得更好的表達。我知道我遲早會見到你! – harpo

+0

@harpo:不客氣。 –