2010-09-14 79 views
2

所以給這個XML ...需要一個XPath,將檢查所有的孩子,孫子女或曾孫的屬性值,等

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <tree dah="false"> 
     <tree dah="false"> 
      <tree dah="false"/> 
      <tree dah="false"/> 
     </tree> 
     <tree dah="false"> 
      <tree dah="true"/> 
      <tree dah="false"/> 
     </tree> 
    </tree> 
</root> 

...我需要一個XPath,將評估爲true,因爲至少有一棵樹/ @ dah ='true'。

但是,如果XML看起來像這樣,將計算結果爲假......

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <tree dah="false"> 
     <tree dah="false"> 
      <tree dah="false"/> 
      <tree dah="false"/> 
     </tree> 
     <tree dah="false"> 
      <tree dah="false"/> 
      <tree dah="false"/> 
     </tree> 
    </tree> 
</root> 

另外,樹節點可以是任何深度。在我的例子中,我有三個層次,但可能會更深入。

+0

好問題(+1)。請參閱我的回答,瞭解兩個XPath表達式,它們返回的布爾值與您的問題中指定的完全相同。 – 2010-09-15 00:04:22

回答

1
/root//tree[@dah='true'] 
+0

我不想要這個節點,但是你的解決方案的工作方式是/ root // tree/@ dah ='true'。謝謝。 – dacracot 2010-09-14 23:29:14

+0

// tree/@ dah =「true」或/ root // tree/@ dah =「true」應該讓你只是真或假。 – Dunderklumpen 2010-09-14 23:54:16

+1

@dacracot,MooGoo的答案*將*按照您的要求評估爲真/假。如果'/ root // tree [@dah ='true']'選擇一個空的節點集,在布爾上下文中計算結果爲false。一個非空的節點集在布爾上下文中求值爲true。 – LarsH 2010-09-15 04:51:52

2

使用

boolean(/root//tree[@dah='true']) 

boolean((/root//tree[@dah='true'])[1]) 

兩個表達式是等效,但第二個將與啞(非優化)的XPath引擎更有效。

結果是true()如果存在與值「真」一個dah屬性的XML文檔中的tree元件 - 否則結果爲false()

+0

爲什麼「boolean()」函數? – dacracot 2010-09-15 16:23:32

+0

另外,是[1]告訴它停止在第一次出現? – dacracot 2010-09-15 16:24:45

+0

@dacracot [爲什麼boolean()fn。]因爲你想'true' /'false'返回,這正是'boolean()'函數的作用:http://www.w3.org/TR/1999/REC-xpath-19991116 /#function-boolean – 2010-09-15 16:33:25