2013-10-02 4 views
3

Для ввода XMLКакая разница между именем() состояние и само :: оси

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <a>1</a> 
    <b>2</b> 
    <b>3</b> 
    <c>4</c> 
</root> 

Интересно, есть ли какая-то разница между следующие XPath

//b 

//*[name() = 'b'] 

//*[self::b]  (or //self::b) 

Эти выражения, кажется, возвращая такой же результат, но всегда ли это верно? У меня есть тенденция к их взаимообмену, но у меня такое чувство, что я не должен.

ответ

1

Одно из отличий заключается в том, что функция name() использует объявления пространства имен, действующие на переданный узел (обычно из источника XML), в то время как другие методы используют объявления пространства имен из контекста выражения. Это означает, что функция name() может привести к непредсказуемым результатам, если разные входные документы используют разные префиксы пространства имен.

Другое отличие состоит в том, что функция name() также работает для узлов, отличных от элементов. Но для элементов без пространств имен вы можете использовать все методы взаимозаменяемо.

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