2010-06-14 2 views
0

, например, у меня есть этот XMLНайти элемент, у которого все дети имеют заданное значение

<elements> 
<a> 
    <b>6</b> 
    <b>5</b> 
    <b>6</b> 
</a> 
<a> 
    <b>5</b> 
    <b>5</b> 
    <b>6</b> 
</a> 
<a> 
    <b>5</b> 
    <b>5</b> 
    <b>5</b> 
    <b>5</b> 
</a> 
</elements> 

мне нужен XPATH запрос, который должен вернуть мне родительский тег, только если все ее дети равны 5 (a [3] в этом случае). Что-то вроде этого

//b[text()="5"]/.. 

но с проверкой всех детских тегов. Обратите внимание, что количество тегов для детей может отличаться от узла к узлу.

Возможно только с запросом xpath?

благодаря

ответ

4
/elements/a[count(b) = count(b[.="5"])] 
+0

awesome! благодаря! – nukl

+0

Полезно знать. Я знаю функцию count(), но что это за "."? – Syd

+0

'.' - это« сам », текущий элемент контекста - элемент в этом случае. В этом случае, поскольку слева находится строка, элемент будет стрифицирован. –

2

Вместо того, чтобы искать элементы, где все <b/> равно 5, вы можете искать элементы, которые не имеют какой-либо <b/> не равна 5. семантически то же самое, но более производительным, потому что вы не нужно рассматривать всех детей, если какой-либо из них не является «5», то механизм XPath может залоговать рано, не оценивая остальных.

Другими словами, «все b равны 5» - это то же самое, что «нет b, а не 5.».

/elements/a[not(b != "5")] 

Заметим, что оба выражения являются истинными, если нет <b/> вообще, вам придется добавить еще один предикат для этого.

+0

отличная идея! благодаря! – nukl

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