Lưu ý: Thông tin sau đây giả sử dụng XPath 1.0.
Biểu thức sau trả về phần tử (s) với giá trị lớn nhất id
:
/*/book[not(@id < preceding-sibling::book/@id) and
not(@id < following-sibling::book/@id)]
Lưu ý rằng đây là hơi khác so với @ timbooo của câu trả lời ở chỗ này sẽ trở lại nhiều hơn một phần tử khi có trùng lắp với cùng một giá trị tối đa (@ timbooo sẽ không trả về giá trị nào). Nếu bạn chỉ muốn có một phần tử trong trường hợp này, thì bạn cần một chiến lược phân giải. Để chọn các yếu tố đầu tiên như vậy theo thứ tự tài liệu, sử dụng này:
/*/book[not(@id < preceding-sibling::book/@id) and
not(@id < following-sibling::book/@id)][1]
để lựa chọn người cuối cùng, sử dụng này:
/*/book[not(@id < preceding-sibling::book/@id) and
not(@id < following-sibling::book/@id)][last()]
Cách tiếp cận này là rất không hiệu quả (O(n^2)
) bởi vì nó đòi hỏi bạn phải so sánh mỗi phần tử với mọi CPC tối đa tiềm năng khác Vì lý do này, tốt nhất bạn nên sử dụng ngôn ngữ lập trình máy chủ để chọn phần tử tối đa. Đơn giản chỉ cần chọn tất cả các yếu tố book
trước và sau đó chọn giá trị tối đa từ danh sách đó. Đây là (rất có thể) một hoạt động tuyến tính (O(n)
), mà sẽ là đáng chú ý nhanh hơn trên các tài liệu rất lớn. Ví dụ: trong Java (JAXP), bạn có thể làm như sau:
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"));
Lưu ý rằng đây chỉ là một minh chứng; hãy chắc chắn bao gồm kiểm tra null nếu thích hợp.
Nguồn
2012-01-03 02:05:12
+1, cho dứa: P –
Ngôn ngữ máy chủ của bạn để thực thi XPath là gì? Nếu bạn đang sử dụng XPath 1.0 (mà không có hàm 'max') thì có thể nhanh hơn để chọn tất cả các phần tử đầu tiên và tìm số tối đa trong PL của bạn. –
Tôi đang sử dụng Perl 5.10. – HerbSpiral