假设我有这样的xml:
<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
子节点@country
UK
但没有@obsolete
true
的产品节点}。我可以说
/Products/Product[Manufacturer/@country = 'UK' and not(@obsolete = 'true)]
或
/Products/Product[Manufacturer/@country = 'UK'][not(@obsolete = 'true')]
并且都得到了我想要的节点。
我的问题是,这两种方法和条件之间是否有任何功能差异?是否存在不同方法可能产生不同结果的情况? (我意识到and
在更复杂的条件下起作用)在风格上,一个比另一个更受欢迎?
(我正在使用C#和.NET 2.0,但我不认为这会对答案有任何影响)
答案 0 :(得分:7)
对于您所处的and
,他们会给您相同的结果。至于风格,选择更能表达你意图的风格。
但是,只要您开始使用position()
,count()
,first()
和last()
等位置功能,就会发挥作用。
亲眼看看:
/Products/Product[Manufacturer/@country = 'UK' and (position() = 1)]
如果列表中的第一个产品不是来自英国,不会返回任何节点,而:
/Products/Product[Manufacturer/@country = 'UK'][position() = 1]
将返回与UK匹配的第一个节点作为国家/地区,也可以以简短形式写入:
/Products/Product[Manufacturer/@country = 'UK'][1]
答案 1 :(得分:5)
它们之间的区别是:
… and …
)是单个谓词;它必须作为一个整体来实现…][…
)是多个谓词;他们一个接一个地进行评估只要您使用连词(逻辑“和”)将条件联系在一起,结果就是一样的。后者无法实现分离(逻辑“或”)。
另请注意,多个谓词按其定义的顺序进行处理,因此
/Products/Product[Manufacturer/@country = 'UK'][2]
表示“在英国制造的第二个产品”,而
/Products/Product[Manufacturer/@country = 'UK' and position() = 2]
表示“列表中的第二个产品,但仅限于在英国生产”。
答案 2 :(得分:2)
答案 3 :(得分:1)
虽然内部处理方式可能略有不同,但两种陈述之间没有区别。同样地,对于是否一个在另一个上没有性能上的好处或建议。
我个人更喜欢第一个(and
),因为它更容易分辨出发生了什么,特别是当你添加更复杂的比较时(和 s和或 s)混合。