iLeft = vNodes[iTok].indexOf("[");
if (iLeft>0) {
iRight = vNodes[iTok].indexOf("]");
if (iRight==-1)
throw new DOMException(DOMException.INVALID_ACCESS_ERR, "missing right bracket");
// Sacar el contenido dentro de los corchetes
vAttrs[iTok] = vNodes[iTok].substring(iLeft+1,iRight);
// Eliminar las arrobas
vAttrs[iTok] = vAttrs[iTok].replace('@',' ');
// Cambiar las comillas simples por dobles
vAttrs[iTok] = vAttrs[iTok].replace((char)39,(char)34);
// Eliminar los espacios en blanco
vAttrs[iTok] = vAttrs[iTok].trim();
// Asignar al nodo el valor quitando el contenido de los corchetes
vNodes[iTok] = vNodes[iTok].substring(0, iLeft);
}
else
vAttrs[iTok] = "";
if (DebugFile.trace) DebugFile.writeln("Token " + String.valueOf(iTok) + " : node=" + vNodes[iTok] + ", attr=" + vAttrs[iTok]);
} // next (iTok)
// Buscar el nodo
iLeft = 0;
iNode = 0;
while (iNode<iNodeCount) {
// Primero recorrer el documento XML para buscar nodos coincidentes
iLeft = sXMLDoc.indexOf("<" + vNodes[iNode], iLeft);
if (iLeft<0) {
if (DebugFile.trace) DebugFile.writeln("Node " + vNodes[iNode] + " not found");
throw new DOMException(DOMException.NOT_FOUND_ERR, "Node " + vNodes[iNode] + " not found");
} // fi(iLeft<0)
iRight = sXMLDoc.indexOf(">", iLeft+1);
if (iRight<0) {
if (DebugFile.trace) DebugFile.writeln("Unclosed Node " + vNodes[iNode] + " missing >");
throw new DOMException(DOMException.SYNTAX_ERR, "Unclosed Node " + vNodes[iNode] + " missing >");
}
sCurrent = sXMLDoc.substring(iLeft+1, iLeft+vNodes[iNode].length()+1);
if (vNodes[iNode].equals(sCurrent)) {
if (vAttrs[iNode].length()==0) {
// No hay atributos, dar por coincidente el primer nodo que aparezca
iNode++;
}
// Tratar de forma especial la función position() de XPath
else if (vAttrs[iNode].startsWith("position()")) {
String[] aAttrValue = Gadgets.split2(vAttrs[iNode], '=');
if (aAttrValue.length<2)
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "position() function can only be declared equal to last() function");
else {
if (aAttrValue[1].equals("last()")) {
if ( isLastSibling (sXMLDoc, iRight, vNodes[iNode-1], sCurrent) ) {
bAttrs[iNode] = true;
iNode++;
} // fi (isLastSibling)
} // fi (aAttrValue[1])
else
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "position() function can only be declared equal to last() function");
}
}
else {
// Mirar si el valor del atributo del nodo actual coincide con el especificado en XPath
iAttr = sXMLDoc.indexOf(vAttrs[iNode], iLeft+1);
if (iAttr>iLeft && iAttr<iRight) {
bAttrs[iNode] = true;
iNode++;
}
}
} // fi(substring(<...)==vNode[])
if (iNode<iNodeCount) iLeft = iRight;
} // wend
if (0==iLeft) {
for (int b=0; b<iNodeCount; b++) {
if (false == bAttrs[b]) {
if (DebugFile.trace) DebugFile.writeln("Attribute " + vAttrs[b] + " of node " + vNodes[b] + " not found");
throw new DOMException(DOMException.NOT_FOUND_ERR, "Attribute " + vAttrs[b] + " of node " + vNodes[b] + " not found");
} // fi(bAttrs[b])
} // next(b)
} // fi(iLeft<0)
if (DebugFile.trace) {