2013-12-09 4 views
1

Я ищу XPath Expression, чтобы получить пространство имен по умолчанию для узла.XPath Expression для получения пространства имен по умолчанию

Мое XML-документ может выглядеть следующим образом.

<aaa> 
    <bbb xmlns="ns1" xmlns:ggg="ns2" attribute="value" attribute2="value2"> 
     <ccc /> 
    </bbb> 
    <bbb xmlns="ns4" xmlns:ggg="ns5" attribute="value" attribute2="value2"> 
     <ddd /> 
    </bbb> 
</aaa> 

Я хочу получить ns1. Я пробовал его со следующими выражениями, но ни одно из них не работало (я программирую на Java 1.7 (так это XPath 1.0) и тестировался с помощью онлайн-визуализатора XPath на http://chris.photobooks.com/xml/default.htm).

/aaa/*[name()='bbb' and position()=1]/attribute::* 

Это выражение выбирает только attribute - и attribute2 -nodes.

/aaa/*[name()='bbb' and position()=1]/namespace::* 

Это выражение ничего не выбирает.

Буду признателен, если информация у меня есть.

ответ

2

Ваше выражение

/aaa/*[name()='bbb' and position()=1]/namespace::* 

правильно и возвращает три узла пространства имен. Проблема может заключаться в том, как вы обрабатываете эти узлы после их возврата. Выражение должно работать как в XPath 1.0, так и в XPath 2.0, хотя я не проверял его с помощью механизма XPath, встроенного в JDK.

(Кстати, понятие о том, что, поскольку вы используете JDK 1.7, поэтому вы используете XPath 1.0, это совершенно нелогично, поскольку для пользователей Java доступно несколько движков XPath 2.0).

Для возврата только пространство имен URI, соответствующее пространство имен по умолчанию, используйте

/aaa/*[name()='bbb' and position()=1]/namespace::*[name()=''] 

или действительно, так как этот запрос уже предполагает, что элемент ГЭБ находится в пространстве имен по умолчанию, используйте

namespace-uri(/aaa/*[name()='bbb' and position()=1]) 
+0

Спасибо за ответ. Я рад, что не ошибся. Это действительно была сборка в движке XPath. Теперь я использую саксонскую библиотеку, и все работает нормально. –

0

Этот page объясняет функцию пространства имен-uri в xpath.

Похоже, что вы хотите что-то вроде этого:

namespace-uri(/aaa/*[name()='bbb' and position()=1]) 

Если пространство имен не указано, вы получите пустую строку в качестве результата.

EDIT: Я перечитал ваш вопрос и не уверен, что мой ответ - это то, что вы ищете. Функция namespace-uri используется для поиска uri для таких узлов, как <ns1:bbb>. Он вернет uri для ns1. Я не уверен, что есть способ использовать x-path для поиска определений пространства имен, кроме тех случаев, когда они фактически используются.

+0

Привет , ты понял меня правильно. Это хорошее решение, хотя, как и мой запрос, он не работает в сборке XPath. Изменения в саксонской библиотеке работали нормально. Благодаря! –

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