Recientemente para un desarrollo AJAX tuve que asegurarme de poder evaluar y recorrer el resultado de una expresión XPath de forma independiente al navegador. Mozilla (Firefox), Opera y cia implementan el estándar DOM XPath, mientras que IE para variar va por libre (aunque todo hay que decirlo, IE tuvo evaluación XPath mucho antes de que existiera este estándar). El problema no es solo que la forma de evaluar expresiones XPath es diferente, sino que para más inri el objeto devuelto por la función evaluadora es distinto también.
Finalmente, la solución es una función genérica que además devuelve un objeto encapsulador cuyo código varía según el navegador:
function selectXPath(expr, node) { if (document.evaluate) { return { list : node.evaluate(expr,node,null,XPathResult.ANY_TYPE,null), next : function() { return this.list.iterateNext() } } } else { return { list: node.selectNodes(expr), i : 0, next: function() { if (this.i > this.list.length) return null; return this.list[this.i++]; } } } }
La funciön primero comprueba si existe una implementación de DOM XPath y si es así, la usa. Si no, asume que el navegador utiliza la función de IE selectNodes(). En ambos casos se devuelve un objeto que internamente contiene el resultado y que va proporcionando nodos mediante la función next().
Un ejemplo de uso podría ser el siguiente:
function test() { var imagenes="Lista de imagenes de este documento: "; if (document.evaluate) var result = selectXPath("//IMG",document); else var result = selectXPath("//IMG",document2DOM()); var nodo; do { nodo = result.next(); if (nodo) imagenes += nodo.getAttribute("src") + "\n"; } while (nodo); alert(imagenes); }
Pulsa para probar la función "en vivo".
|
xpath.js ( 415 bytes ) |