Как упростить это выражение Xpath? - PullRequest
0 голосов
/ 14 января 2011

У меня есть следующий XML-код:

<root>
   <a><l_desc/></a>
   <b><l_desc>foo</l_desc></b>
   <c><l_desc>bar</l_desc></c>
</root>

Я хочу сопоставить узлы l_desc с a или b узлы в качестве родителя.
Сейчас я использую это выражение xpath: //a/l_desc/.. | //b/l_desc/..

Я бы предпочел написать что-то вроде этого: //(a|b)/l_desc/.. К сожалению, это выражение недопустимо.

Есть ли у вас идеи по сокращению первого выражения?Xpath должен использоваться в таблице стилей XSLT v1.0.

Stéphan

Ответы [ 4 ]

3 голосов
/ 14 января 2011

Я хочу сопоставить l_desc узлы с узлы a или b в качестве родителя

Более просто:

/root/a/l_desc | /root/b/l_desc

или

/root/*[self::a | self::b]/l_desc

С запуском // оператора (плохой дизайн, неизвестная схема):

//a/l_desc | //b/l_desc

Или

//*[self::a | self::b]/l_desc

В XPath 2.0 это действительно

/root/(a|b)/l_desc
1 голос
/ 14 января 2011

Использование:

/*/*[self::a or self::b]/l_desc

Это означает : выберите все элементы l_desc, которые являются дочерними элементами любого элемента a или b, который сам является дочерним элементом верхнего элемента документа XML.

Избегайте

  1. Использование сокращения // , когда вы знаете структуру документа. // может быть очень неэффективным.

  2. Использование обратной оси (например, parent::), когда в этом нет необходимости. Выражения, содержащие обратные оси, более сложны для понимания и могут быть менее эффективными, чем выражения, содержащие только прямые оси.

1 голос
/ 14 января 2011

Как насчет

//l_desc[parent::a or parent::b]

1 голос
/ 14 января 2011

вы можете использовать предикат здесь

l_desc[../a|../b]
...