2009-07-22 3 views
1

Голова болит на этом, так что кто-то может бросить мне линию?Головная боль XPath, найти узлы с атрибутами между диапазоном

XML, как так (не реальные вещи, но это пример для наглядности):

<root> 
    <groups name="A"> 
     <entry from="1" to="10" /> 
    </groups> 
    <groups name="A"> 
     <entry from="11" to="20" /> 
     <entry from="21" to="30" /> 
    </groups> 
    <groups name="A"> 
     <entry from="31" to="40" /> 
     <entry from="41" to="50" /> 
     <entry from="51" to="60" /> 
    </groups>  
</root> 

Учитывая номер записи Я хочу найти узел ввода, что это число падает между ними. Должен быть только один узел, который соответствует (если есть).

Херес XPath Я использую:

/корень/группы/запись [@from> = 45 и @to < = 45]

Я попытался обертывание атрибуты числа() тоже, но все равно не повезло.

Это не возвращает то, что я ожидал бы, на самом деле он ничего не возвращает, и я не понимаю, почему! Что мне не хватает?

Редактировать: Исправлена ​​моя опечатка открывающих групп тегов ... извините.

ответ

3

Это конкретное выражение ничего не возвращает, потому что нет элементов entry, которые удовлетворяют условию. Прежде всего, я хотел бы предложить изменить его на:

/root/groups/entry[@from <= 45 and @to >= 45] 

Plus, если это действительно ваш источник XML, он не будет работать, потому что это недопустимо. У вас есть <group> открытые теги, но </groups> закрывающие теги. Они не совпадают. Вы должны изменить их все на group или groups, и ваше выражение XPath должно отразить это.

Я проверил, что выражение против модифицированной версии вашего XML (с group изменен groups), и он вернулся один результат, как ожидалось:

<entry from="41" to="50" /> 
+0

DOH! Конечно, неправильные сравнения! Огромное вам спасибо, это наматывало меня на час. О, позор ... –

+0

Как насчет: '/ root/groups/entry [@from <= 45 и 45 <= @to]'? Гораздо яснее, ИМХО. – Tomalak

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