Получить первый узел с использованием E4X со смешанными пространствами имен?

Рассмотрим фрагмент XML с несколькими пространствами имен:

<meal xmlns="urn:hl7-org:v3">
    <veg id="7" />
    <lunch id="123">
        <veg id="990" />
    </lunch>
    <dinner id="324">
         <veg id="111" />
    </dinner>
 </meal>

Как с помощью JavaScript E4X явно выбрать свойство id первого veg узла?

Также важно явно включить все пространства имен. Это причина моего синтаксиса ..*:: ниже. Я понимаю, что использую не тот оператор.

Я пробовал это, что, к сожалению, получает ВСЕ значения идентификатора вегетарианского узла:

var veg = meal..*::[email protected]()
//currently gets 7990111

Как я могу получить значение 7?


person p.campbell    schedule 21.03.2011    source источник
comment
Выражение XPath 1.0 будет (//*[local-name()='veg])[1]/@id, а XPath 2.0 будет (//*:veg)[1]/@id. Если вы не ищете решение XPath, поменяйте теги.   -  person    schedule 21.03.2011


Ответы (2)


Попробуйте это: var veg = meal..*::veg[position()=1][email protected]()

veg[position()=1] сообщает XPath, что вам нужен овощной узел в первой позиции. Я просто завершаю ваше первоначальное выражение xpath.

person Stephan    schedule 21.03.2011
comment
Я не знаком с призывом к позиции. Это E4X? - person csj; 21.03.2011
comment
position() = 1 - это XPath, а не E4X. - person Martin Honnen; 21.03.2011

person    schedule
comment
Я не обновлял свой экран перед публикацией, и я не понимал, что это более или менее идентично ответу Мартина (за исключением очень незначительной разницы, что я создаю список идентификаторов, а он создает список узлов veg Однако было бы полезно отметить, что узел верхнего уровня (еда) XML не требует прямой ссылки. В моем случае я создал переменную с тем же именем, что и верхний узел, что, как мне кажется, улучшает читаемость. - person csj; 21.03.2011