Nota: La siguiente información asume el uso de XPath 1.0.
La siguiente expresión devuelve el elemento (s) con el mayor id
valor:
/*/book[not(@id < preceding-sibling::book/@id) and
not(@id < following-sibling::book/@id)]
Tenga en cuenta que esto es ligeramente diferente a la de @ timbooo respuesta en que esto va a devolver más de un elemento cuando hay duplicados con el mismo valor máximo (@ timbooo's no devolvería ninguno). Si solo quieres un elemento en este caso, entonces necesitas una estrategia de resolución. Para elegir el primero de esos elementos en el orden del documento, utilice esto:
/*/book[not(@id < preceding-sibling::book/@id) and
not(@id < following-sibling::book/@id)][1]
para elegir el último, utilizar esto:
/*/book[not(@id < preceding-sibling::book/@id) and
not(@id < following-sibling::book/@id)][last()]
Este enfoque es muy ineficiente (O(n^2)
), ya que requiere que usted pueda comparar cada elemento a cada otro potencial max. Por este motivo, probablemente sea mejor usar el lenguaje de programación de su host para seleccionar el elemento máximo. Simplemente seleccione todos los elementos book
primero y luego elija el máximo de esa lista. Esta es (muy probablemente) una operación lineal (O(n)
), que sería notablemente más rápida en documentos muy grandes. Por ejemplo, en Java (JAXP) es posible hacerlo de esta manera:
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList nodes = (NodeList) xpath.evaluate("/*/book", doc,
XPathConstants.NODESET);
Node max = nodes.item(0);
for (int i = 0; i < nodes.getLength(); i++) {
int maxval = Integer.parseInt(max.getAttributes()
.getNamedItem("id").getNodeValue());
int curval = Integer.parseInt(nodes.item(i).getAttributes()
.getNamedItem("id").getNodeValue());
if (curval >= maxval)
max = nodes.item(i);
}
System.out.println(max.getAttributes().getNamedItem("name"));
Tenga en cuenta que esto es sólo una manifestación; asegúrese de incluir null-checks cuando corresponda.
+1, para la piña: P –
¿Cuál es su idioma de host para ejecutar XPath? Si está utilizando XPath 1.0 (que no tiene una función 'max'), probablemente sea más rápido seleccionar primero todos los elementos y encontrar el máximo en su PL. –
Estoy usando Perl 5.10. – HerbSpiral