什麼是選擇所有的酒吧元素是 兒童根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>
那不是合法的XML文檔。有多個根元素。 – Cheeso
bar4不是root foo的孩子。 –
@Michael Kay - 你是對的,根foo應該覆蓋qux元素。請看我對第一個答案的第一個迴應。 – user897210