2009-12-14 4 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 подузел с @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, но я не верю, что будет иметь какое-либо отношение к ответу)

ответ

7

and в вашей ситуации, они дают вам те же результаты. Что касается стиля, выберите тот, который лучше выражает ваше намерение.

Однако, как только вы начинаете использовать позиционные функции, такие как position(), count(), first() и last(), он делает разницу.

Смотрите сами:

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

не возвращает узел, если первый продукт в списке не из Великобритании, в то время как:

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

возвращает первый узел, соответствующий Великобританию в качестве страна, а также могут быть написаны в краткой форме:

1

Хотя может быть небольшая разница в том, как они обрабатываются внутри, есть нет разницы между двумя вашими утверждениями. Точно так же нет преимуществ по эффективности или рекомендации относительно того, следует ли одному другому.

Я лично предпочитаю первый (and), как это легче сказать, что происходит, в частности, при добавлении более сложных сравнений (и с и или S) к соединению.

5

Разница между ними:

  • Первый вариант (… and …) - это один предикат; он должен быть выполнен в целом
  • второй вариант (…][…) - несколько предикатов; они оцениваются один за другим

Если вы используете соединение (логическое «и») для согласования условий, результат будет таким же. Дизъюнкция (логическая "или") не достижима с последней.

отметить также, что несколько предикаты обрабатываются в том порядке, они определены, так

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

означает «второй продукт из тех, которые производятся в Великобритании», в то время как

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

означает "второй продукт в списке, но только при его изготовлении в Великобритании".

Смежные вопросы