Điều tôi cần không hoàn toàn phù hợp với các bài viết khác của một tựa đề tương tự.Biểu thức độc quyền hoặc nút cài đặt XPath 1.0
Tôi cần, sử dụng Xpath 1, để có thể nhận nút a hoặc nút b, theo thứ tự đó, theo thứ tự đó. Tức là, nút a nếu nó tồn tại, nếu không, nút b.
một biểu thức XPath như:
expression | expression
sẽ làm cho tôi cả trong trường hợp cả hai đều tồn tại. đó không phải là điều tôi muốn.
tôi có thể đi:
(expression | expression)[last()]
mà trên thực tế gget tôi những gì tôi cần (trong trường hợp của tôi), nhưng có vẻ là một chút không hiệu quả, bởi vì nó sẽ đánh giá cả hai mặt của biểu trước kết quả cuối cùng được chọn. Tôi đã hy vọng cho một biểu thức đó sẽ ngừng làm việc một khi phía bên trái thành công.
Một ví dụ cụ thể hơn về XML
<one>
<two>
<three>hello</three>
<four>bye</four>
</two>
<blahfive>again</blahfive>
</one>
và xpath mà làm việc (nhưng không hiệu quả):
(/one/*[starts-with(local-name(.), 'blah')] | .)[last()]
Để được rõ ràng, tôi muốn lấy các nút con trực tiếp của 'một' bắt đầu bằng 'blah'. Tuy nhiên, nếu nó không tồn tại, tôi chỉ muốn nút hiện tại. Nếu nút 'blah' không tồn tại, tôi không muốn nút hiện tại.
Có cách nào hiệu quả hơn để đạt được điều này không?
+1 Thú vị câu hỏi và IMHO một giải pháp rất thanh lịch cho nó. Bạn có thể giải thích lý do tại sao bạn quan tâm đến hiệu suất trong trường hợp này? Đánh giá từ kinh nghiệm của tôi, mất hiệu suất trong các bảng XSLT do các nguyên nhân khác gây ra. –
Xin chào. Nó thực sự cho một ứng dụng java. Ứng dụng sử dụng các biểu thức xpath (được tải từ tệp cấu hình) để trích xuất các giá trị từ một tài liệu XML. Ứng dụng sẽ nhận được nhiều tài liệu như vậy mỗi phút, vì vậy hiệu quả là quan trọng để cải thiện (hoặc thậm chí đạt được) đáng tin cậy thông qua đặt. – svaens
Nếu điều này được nhúng vào Java, bạn sẽ/có thể có quyền kiểm soát các biểu thức con bằng cách thực hiện rõ ràng XPath thứ hai chỉ khi kết quả đầu tiên không mang lại kết quả, đúng không? –