Câu trả lời:
Sử dụng:
(/bookstore/book[@location='US'])[1]
Điều này trước tiên sẽ có được các thành phần sách có thuộc tính vị trí bằng 'US'. Sau đó, nó sẽ chọn nút đầu tiên từ tập hợp đó. Lưu ý việc sử dụng dấu ngoặc đơn, được yêu cầu bởi một số triển khai.
Lưu ý, điều này không giống như /bookstore/book[1][@location='US']
trừ khi phần tử đầu tiên cũng có thuộc tính vị trí đó.
/bookstore/book[@location='US'][1]
không trả lại tất cả sách từ 'US'. Tôi đã thử nghiệm nó lần thứ hai và dưới các triển khai xpath của các ngôn ngữ khác nhau. /bookstore/book[@location='US'][1]
trả lại cuốn sách 'US' đầu tiên dưới hiệu sách. Nếu có các cửa hàng sách đột biến, thì nó sẽ trả lại đầu tiên từ mỗi cửa hàng. Đây là những gì OP yêu cầu (nút đầu tiên trong hiệu sách). Phiên bản của bạn chỉ trả về một cuốn sách từ tất cả các nhà sách (trận đấu đầu tiên).
/bookstore/book[@location='US'][1]
chỉ hoạt động với cấu trúc đơn giản.
Thêm một chút cấu trúc và những thứ phá vỡ.
Với
<bookstore>
<category>
<book location="US">A1</book>
<book location="FIN">A2</book>
</category>
<category>
<book location="FIN">B1</book>
<book location="US">B2</book>
</category>
</bookstore>
/bookstore/category/book[@location='US'][1]
sản lượng
<book location="US">A1</book>
<book location="US">B2</book>
không phải "nút đầu tiên phù hợp với điều kiện phức tạp hơn". /bookstore/category/book[@location='US'][2]
trả lại không có gì.
Với dấu ngoặc đơn, bạn có thể nhận được kết quả mà câu hỏi ban đầu dành cho:
(/bookstore/category/book[@location='US'])[1]
cho
<book location="US">A1</book>
và (/bookstore/category/book[@location='US'])[2]
hoạt động như mong đợi.
/bookstore/book[1]
và KHÔNG (/bookstore/book)[1]
. Trường hợp bạn cung cấp không giống như trường hợp OP yêu cầu. Có lẽ, OP đã chấp nhận câu trả lời của tôi vì nó đã làm những gì anh ấy mong đợi (và yêu cầu).
'(//div[text() = "'+ name +'"])[1]/following-sibling::*/div/text()'
. Trong trường hợp có nhiều nút khớp name
.
Như một lời giải thích cho câu trả lời của Jonathan Fingerland:
[position()=1 and @location='US']
) phải đúng như một toàn thể[position()=1][@location='US']
) phải đúng với nhau[position()=1][@location='US']
! = [@location='US'][position()=1]
[position()=1 and @location='US']
==[@location='US' and position()=1]
[position()=1]
có thể được viết tắt là[1]
Bạn có thể xây dựng biểu thức phức tạp trong các vị từ với các nhà khai thác Boolean " and
" và " or
", và với hàm Boolean XPath not()
, true()
và false()
. Ngoài ra, bạn có thể gói các biểu thức con trong ngoặc đơn.
Cách dễ nhất để tìm nút sách tiếng Anh đầu tiên (trong toàn bộ tài liệu), xem xét tệp xml phức tạp hơn, như:
<bookstore>
<category>
<book location="US">A1</book>
<book location="FIN">A2</book>
</category>
<category>
<book location="FIN">B1</book>
<book location="US">B2</book>
</category>
</bookstore>
là biểu thức xpath:
/descendant::book[@location='US'][1]
<bookstore>
<book location="US">A1</book>
<category>
<book location="US">B1</book>
<book location="FIN">B2</book>
</category>
<section>
<book location="FIN">C1</book>
<book location="US">C2</book>
</section>
</bookstore>
Vì vậy, đưa ra ở trên; bạn có thể chọn cuốn sách đầu tiên với
(//book[@location='US'])[1]
Và điều này sẽ tìm thấy cái đầu tiên ở bất cứ đâu có vị trí Mỹ. [A1]
//book[@location='US']
Sẽ trả về nút được đặt với tất cả các sách có vị trí US. [A1, B1, C2]
(//category/book[@location='US'])[1]
Sẽ trả lại vị trí sách đầu tiên Hoa Kỳ tồn tại trong một danh mục ở bất kỳ đâu trong tài liệu. [B1]
(/bookstore//book[@location='US'])[1]
sẽ trả lại cuốn sách đầu tiên có vị trí Hoa Kỳ tồn tại ở bất cứ đâu dưới hiệu sách gốc của phần tử gốc; làm cho phần / hiệu sách thực sự dư thừa. [A1]
Trả lời trực tiếp:
/bookstore/book[@location='US'][1]
Sẽ trả lại cho bạn nút đầu tiên cho thành phần sách có vị trí US nằm dưới hiệu sách [A1]
Ngẫu nhiên nếu bạn muốn, trong ví dụ này để tìm cuốn sách đầu tiên ở Hoa Kỳ không phải là con trực tiếp của hiệu sách:
(/bookstore/*//book[@location='US'])[1]
Sử dụng chỉ mục để có được nút mong muốn nếu xpath phức tạp hoặc nhiều hơn một nút có cùng xpath.
Ví dụ :
(//bookstore[@location = 'US'])[index]
Bạn có thể đưa ra số nút mà bạn muốn.
cho người cũ
<input b="demo">
Và
(input[@b='demo'])[1]
Với sự giúp đỡ của một người kiểm tra xpath trực tuyến Tôi đang viết câu trả lời này ...
Đối với điều này:
<table id="t2"><tbody>
<tr><td>123</td><td>other</td></tr>
<tr><td>foo</td><td>columns</td></tr>
<tr><td>bar</td><td>are</td></tr>
<tr><td>xyz</td><td>ignored</td></tr>
</tbody></table>
xpath sau:
id("t2") / tbody / tr / td[1]
đầu ra:
123
foo
bar
xyz
Vì 1 có nghĩa là chọn tất cả các phần tử td là con đầu tiên của cha mẹ trực tiếp của chúng.
Nhưng xpath sau:
(id("t2") / tbody / tr / td)[1]
đầu ra:
123