Uwaga: Poniższe informacje zakłada wykorzystanie XPath 1.0.
Poniższe wyrażenie zwraca element (ów) z największą id
wartość:
/*/book[not(@id < preceding-sibling::book/@id) and
not(@id < following-sibling::book/@id)]
pamiętać, że jest nieco inny niż @ timbooo na odpowiedź, że będzie to powrót więcej niż jeden element, gdy istnieją duplikaty ta sama maksymalna wartość (@ timbooo nie zwróci żadnej). Jeśli potrzebujesz tylko jednego elementu w tym przypadku, potrzebujesz strategii rozwiązywania problemów. Aby wybrać pierwszy taki element w kolejności dokumentu, użyj tego:
/*/book[not(@id < preceding-sibling::book/@id) and
not(@id < following-sibling::book/@id)][1]
wybrać ostatni, użyj tego:
/*/book[not(@id < preceding-sibling::book/@id) and
not(@id < following-sibling::book/@id)][last()]
Takie podejście jest bardzo nieefektywne (O(n^2)
), ponieważ wymaga, aby porównać każdy element na każdy inny potencjał max. Z tego powodu najlepiej jest użyć języka programowania hosta, aby wybrać maksymalny element. Po prostu wybierz wszystkie elementy book
, a następnie wybierz maksimum z tej listy. Jest to (najprawdopodobniej) operacja liniowa (O(n)
), która byłaby zauważalnie szybsza w przypadku bardzo dużych dokumentów. Na przykład w języku Java (JAXP) możesz to zrobić tak:
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"));
Pamiętaj, że to tylko demonstracja; pamiętaj, aby w razie potrzeby uwzględnić kontrole null.
+1, dla ananasa: P –
Jaki jest twój język hosta do wykonywania XPath? Jeśli używasz XPath 1.0 (który nie ma funkcji "max"), prawdopodobnie szybciej będzie najpierw wybrać wszystkie elementy i znaleźć maksimum w twoim PL. –
Używam Perla 5.10. – HerbSpiral