XPath выражения в Javascript не видят элементы с пространствами имён

Есть HTML документ с примерно таким хедером:

<!DOCTYPE html>
<html xmlns:xf="http://www.w3.org/2002/xforms">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <link rel="stylesheet" href="etc/common.css"/>
  <title>Principal-Jarus rc 1.0.0 common page</title>
  <script src="etc/xforms.js"/>
  <xf:model id="member.login">
    <xf:instance id="login.data1">
        <p>some1</p>
    </xf:instance>
    <xf:instance id="login.data2">
      <members>
        <member id="" login="" password="" nic="" sid="" status="" state="" profile="">
            <p>some2</p>
        </member>
      </members>
    </xf:instance>
    <xf:bind id="login.name" nodeset="xf:instance[@id='login.data']/members/member/@login"/>
    <xf:bind id="login.psw" nodeset="xf:instance[@id='login.data']/members/member/@password"/>
    <xf:submission id="xform.login" method="form-data-post" action="submit"/>
  </xf:model>
</head>
...
</html>

Задача состоит в том, что бы в процессе работы выполнять XPath выражения содержащиеся в атрибутах nodeset элементов xf:bind. Поэтому стандартными DOM методами и выборками по селекторам обойтись не получится, нужно именно выполнение XPath выражений. Единственное что нашёл в арсенале Javascript для работы с XPath - это метод document.evaluate(...) Вроде как он ориентирован на работу с пространствами имён, но у меня почему-то работать наотрез отказывается.

function resolver(prefix) {
  return 'http://www.w3.org/2002/xforms';
}

function submit_form() {
  var model = document.getElementById(mn);  // элемент xf:model выбран
  var nodelist = document.evaluate('descendant::xf:instance',
    model, resolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
  var node = nodelist.iterateNext();
  console.log(node);    
}

Перепробовал множество вариантов resolver, но последний оператор console.log(node) упорно выдаёт null. Хотя если XPath выражение (первый аргумент метода evaluate) заменить на 'descendant::p', то всё работает прекрасно и элементы-параграфы отбираются. Т.е. дело именно в том, что не хочет выполняться XPath выражение с пространством имён: 'descendant::xf:instance'. Какие будут мнения? Заранее спасибо.


Ответы (2 шт):

Автор решения: Sergey Tatarincev

используйте xpath вида local-name()='p'

Функция local-name возвращает локальную часть имени первого в порядке просмотра документа узла множества, переданного ей в качестве аргумента.

функция выбирает узлы имеющие заданное имя игнорируя пространство имен

→ Ссылка
Автор решения: Principal AG

Нашёл решение на: stackoverflow.com

Поставил документу: Content-Type: application/xhtml+xml и пространства имён стали видны. Но теперь возникла диаметрально противоположная проблема. Перестали восприниматься имена без префиксов (с дефолтным пространством имён). Т.е. в моём примере выше: xf:instance[@id='login.data']/*[1] видится прекрасно, а вот xf:instance[@id='login.data']/members[1] видеться не хочет ... от слова "никак". Пытался прослеживать обращения к Резолверу (в моём примере функция:function resolver(prefix)). При встречи конструкции без префикса, обращения не происходит. Отсюда вывод, что пытаться что-то подсунуть в Резолвер для пустого неймспейса - бесполезно. Есть ли какие ни будь идеи? Заранее спасибо.

→ Ссылка