Javascript Xpath и пространства имен по умолчанию

У меня есть JavaScript/Xpath, который работает не так, как я ожидал. (доступно на jsfiddle) Кажется, что я делаю что-то не так с пространством имен XML, что не позволяет мне запрашивать для моих элементов по их именам узлов (тегов).

Если я попытаюсь запросить все дочерние узлы текущего узла, я без проблем найду элемент myElement:

    var xpathResult = xmlDoc.evaluate( "child::*", rootElement, nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
    var queryEl;
    if(queryEl = xpathResult.iterateNext()) {
        alert("child::* found element " + queryEl.nodeName);
    }
    else {
        alert("child::* found nothing!");
    }

... но если я специально нацеливаюсь на узлы с именами узлов (тегов) myElement, я не получаю никаких результатов:

    /* Now try getting only those children with nodeName `myElement` */
   xpathResult = xmlDoc.evaluate( "child::myElement", rootElement, nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
    var queryEl;
    if(queryEl = xpathResult.iterateNext()) {
        alert("child::myElement found element " + queryEl.nodeName);
    }
    else {
        alert("child::myElement found nothing!");
    }

Что я делаю не так?


person Richard JP Le Guen    schedule 08.03.2012    source источник
comment
Не могли бы вы разделить проблему, чтобы показать только проблему? Как короткий и (не)действительный пример?   -  person powtac    schedule 08.03.2012
comment
@powtac - пытался ... но код на самом деле только создает XML-документ, а затем делает 2 запроса к нему. Это действительно просто тестовый случай.   -  person Richard JP Le Guen    schedule 08.03.2012


Ответы (1)


Попробуйте это как ваш преобразователь:

var nsResolver = (function (element) {
    var
      nsResolver = element.ownerDocument.createNSResolver(element),
      defaultNamespace = element.getAttribute('xmlns');

    return function (prefix) {
       return nsResolver.lookupNamespaceURI(prefix) || defaultNamespace;
    };
} (xmlDoc.documentElement));

Вам также нужно будет выбрать такие элементы:

"child::default:myElement"
// where 'default' can be anything, as long as there is a namespace

Дальнейшее чтение:

Ваша скрипка: http://jsfiddle.net/chKZc/5/ (обновлено)

person Yoshi    schedule 08.03.2012
comment
В конце концов, XPath все равно был не лучшим решением... но, похоже, это работает. - person Richard JP Le Guen; 27.03.2012