2016-10-04 2 views
1

У меня возникают серьезные проблемы, пытаясь понять магию, которая является XPath.Как игнорировать пространства имен в XPath 1.0?

В принципе, у меня есть некоторые XML следующим образом:

<a> 
    <b> 
     <c/> 
    </b> 
</a> 

Теперь я хочу, чтобы подсчитать, сколько Б мы имеем, не Кассиопеяне. Это можно легко сделать с помощью следующего XPath:

count(*/b[not(descendant::c)]) 

Теперь вопрос это просто: Как сделать то же самое, игнорируя при этом каких-либо пространств имен?

Я бы предположил, что это было что-то вроде этого?

count(*/[local-name()='b']/[not(descendant::[local-name()='c'])]) 

Но это неверно. Каким будет эквивалент XPath, как я уже говорил, но который игнорирует пространства имен?

+1

Если вы задаете вопрос о XPath 1.0, пожалуйста, проясните это в своем вопросе. В XPath 2.0 и 3.0 вы можете написать *: c для выбора элементов с локальным именем c в любом пространстве имен. –

+1

OP действительно задал вопрос явно как xpath-1.0, но я, вероятно, должен был представить это в названии, которое я сделал. Исправлено. – kjhughes

+0

Хорошо, что я плохой. Я предположил, что этого достаточно, чтобы пометить тему как xpath-1.0. Я обязательно добавлю это к теме в следующий раз. – Kahn

ответ

2

Данный XPath,

count(*/b[not(descendant::c)]) 

может быть переписана игнорировать пространство имен следующим образом:

count(*[local-name()='b' and not(descendant::*[local-name()='c'])]) 

Обратите внимание, что это вообще лучше не победить пространство имен, но работать с ними должным образом назначая префиксы пространства имен и используя их в выражении XPath.

+0

Сладкий, спасибо! Пришлось потратить немного больше времени, задаваясь вопросом, когда реальный сценарий имеет несколько элементов до этого решения, но я попал туда, в конце концов. И я слышу вас о пространствах имен, но в этом случае мы проверили XML-путь перед этой частью. Это в основном просто проверка кода, что мы специально НЕ хотим быть зависимым от пространства имен. – Kahn

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