2009-12-14 58 views
3

假設我有這樣的XML:這兩種樣式的xpath邏輯'和'等價嗎?

<Products> 
    <Product name="Liquid Oxygen"> 
    <Manufacturer name="Universal Exports" country="UK" /> 
    </Product> 
    <Product name="Hydrazine"> 
    <Manufacturer name="ACME Inc." country="USA" /> 
    </Product> 
    <Product name="Gaseous Oxygen" obsolete="true"> 
    <Manufacturer name="Universal Exports" country="UK" /> 
    </Product> 
    <Product name="Liquid Nitrogen"> 
    <Manufacturer name="Penguins R Us" country="Antarctica" /> 
    </Product> 
</Products> 

我想挑選出有Manufacturer子節點與UK@country產品的節點,但不具有的true一個@obsolete。我可以說,無論是

/Products/Product[Manufacturer/@country = 'UK' and not(@obsolete = 'true)] 

/Products/Product[Manufacturer/@country = 'UK'][not(@obsolete = 'true')] 

無一不讓我我想要的節點。

我的問題是,這兩種方法之間有什麼功能差異和條件?有不同的方法可以產生不同的結果嗎? (我知道and在更復雜的條件下起作用)在風格上,是比其他人更喜歡的嗎?

(我使用C#和.NET 2.0,但我不認爲,將會對答案有任何影響)

回答

7

對於and在你的情況,他們給你同樣的結果。至於風格,選擇一個更好地表達你的意圖的風格。

但是,只要你如position()count()first()last()開始使用定位功能,它確實有所作爲。

見自己:

/Products/Product[Manufacturer/@country = 'UK' and (position() = 1)] 

不返回任何節點,如果在列表中的第一個產品從英國是沒有,而:

/Products/Product[Manufacturer/@country = 'UK'][position() = 1] 

將返回匹配英國成爲第一個節點國家,也可以用簡寫形式寫成:

/Products/Product[Manufacturer/@country = 'UK'][1] 
1

雖然有可能是他們是如何內部處理稍有差異,有你的兩個陳述沒有區別。同樣,對於是否相互之間沒有性能優勢或推薦。

我個人比較喜歡第一個(and),因爲它更容易告訴正在發生的事情,尤其是當你添加更多複雜的比較( S和 S)的組合。

5

它們之間的區別是:

  • 第一個變體(… and …)是單個謂詞;它必須作爲一個整體來實現
  • 第二個變體(…][…)是多個謂詞;他們被一個接一個地評估

只要你使用連詞(邏輯「和」)把條件連在一起,結果是一樣的。後者無法實現分離(邏輯「或」)。

還要注意的是多個謂詞中定義它們的順序處理,因此

/Products/Product[Manufacturer/@country = 'UK'][2] 

裝置「在英國被製造的那些的第二產品」,而

/Products/Product[Manufacturer/@country = 'UK' and position() = 2] 

意味着「列表中的第二個產品,但僅當它在英國製造」