注:以下信息假設使用的XPath 1.0。
下面的表達式返回具有最大id
值的元素(S):
/*/book[not(@id < preceding-sibling::book/@id) and
not(@id < following-sibling::book/@id)]
注意,這是略有不同@ timbooo在這個問題的答案時,有與重複這將返回多個元素相同的最大值(@ timbooo's將不返回)。如果你在這種情況下只需要一個元素,那麼你需要一個解決策略。要選擇在文檔順序第一個這樣的元素,使用:
/*/book[not(@id < preceding-sibling::book/@id) and
not(@id < following-sibling::book/@id)][1]
要選擇最後一個,使用此:
/*/book[not(@id < preceding-sibling::book/@id) and
not(@id < following-sibling::book/@id)][last()]
這種做法是非常低效的(O(n^2)
),因爲它需要你去比較每個元素到其他每個潛在的最大值。出於這個原因,最好使用主機編程語言來選擇最大元素。只需首先選擇所有book
元素,然後從該列表中選擇最大值。這很可能是一種線性操作(O(n)
),對於非常大的文檔,這將顯着加快。例如,在Java(JAXP),你可能做這樣的:
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"));
注意,這僅僅是一個示範;務必在適當的地方包含空值檢查。
+1,菠蘿:P – 2012-01-02 14:35:06
執行XPath的主機語言是什麼?如果您使用的是XPath 1.0(它沒有'max'函數),那麼首先選擇所有元素並在您的PL中查找最大值可能會更快。 – 2012-01-03 01:33:32
我使用Perl 5.10。 – HerbSpiral 2012-01-03 08:53:24