Nota: Le seguenti informazioni assume uso di XPath 1.0.
La seguente espressione restituisce l'elemento (s) con il valore più grande id
:
/*/book[not(@id < preceding-sibling::book/@id) and
not(@id < following-sibling::book/@id)]
noti che questo è un po 'diverso da quello @ timbooo di risposta che questo tornerà più di un elemento, quando ci sono i duplicati con lo stesso valore massimo (@ timbooo non restituirebbe nessuno). Se vuoi un solo elemento in questo caso, allora hai bisogno di una strategia di risoluzione. Per scegliere il primo tale elemento al fine del documento, utilizzare questo:
/*/book[not(@id < preceding-sibling::book/@id) and
not(@id < following-sibling::book/@id)][1]
Per scegliere l'ultimo, utilizzare questo:
/*/book[not(@id < preceding-sibling::book/@id) and
not(@id < following-sibling::book/@id)][last()]
Questo approccio è molto inefficiente (O(n^2)
), perché richiede di confrontare ogni elemento a ogni altro potenziale max. Per questo motivo, probabilmente è meglio usare il linguaggio di programmazione dell'host per selezionare l'elemento massimo. Seleziona prima tutti gli elementi book
e poi scegli il massimo da quell'elenco. Questa è (molto probabilmente) un'operazione lineare (O(n)
), che sarebbe notevolmente più veloce su documenti molto grandi. Ad esempio, in Java (JAXP) si potrebbe fare in questo modo:
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"));
Si noti che questo è solo una dimostrazione; assicurati di includere i controlli null, ove appropriato.
fonte
2012-01-03 02:05:12
+1, per l'ananas: P –
Qual è la lingua host per l'esecuzione dell'XPath? Se stai usando XPath 1.0 (che non ha una funzione 'max'), probabilmente è più veloce selezionare prima tutti gli elementi e trovare il massimo nel tuo PL. –
Sto usando Perl 5.10. – HerbSpiral