Hola, al final se me ocurrió mi propia solución poco fiable, cualquier sugerencia sobre la mejora sería muy apreciada. Se hace uso de algunas funciones prototipo:
Obras en IE5 + con XPath de la forma "/ HTML/BODY/DIV [9]/DIV [2]"
función getXPathElement (XPath, elemento) {
//Specific to project, here i know that the body element will always have the id "top"
//but otherwise the element that is passed in should be first element in the xpath
//statement eg. /HTML/BODY/DIV the element passed in should be HTML
if(!element){
element = $("top");
var xpathArrayIndex = 3;
} else {
var xpathArrayIndex = 1;
}
//split the xpath statement up
var xpathArray = xpath.split("/");
var carryOn = true;
while(carryOn){
decendents = element.childElements();
//check to see if we are at the end of the xpath statement
if(xpathArrayIndex == xpathArray.length){
return element;
}
//if there is only one decendent make it the next element
if(decendents.size() == 1) {
element = decendents.first();
} else {
//otherwise search the decendents for the next element
element = getXPathElementByIndex(decendents, xpathArray[xpathArrayIndex]);
}
xpathArrayIndex++;
}
}
función getXPathElementByIndex (decendientes, xpathSegment) {
var decendentsArray = decendents.toArray();
//seperate the index from the element name
var temp = xpathSegment.split("[");
var elementName = temp[0];
//get the index as a number eg. "9]" to 9
var elementIndex = +temp[1].replace("]", "");
//the number of matching elements
var count = 0;
//keeps track of the number of iterations
var i = 0;
while(count != elementIndex) {
//if the decendent's name matches the xpath element name increment the count
if(decendentsArray[i].nodeName == elementName){
count++;
}
i++;
}
var element = decendentsArray[i - 1];
return element;
}
Gracias a todos por su ayuda, de cualquier forma aprendí bastante sobre varios frameworks de JavaScript.
jQuery NO implementa XPath. Implementa una función de selección de ruta muy simple (que es aproximadamente ~ 0.01% de XPath) –