2009-06-17 25 views

Trả lời

318

sử dụng (/bookstore/book[@location='US'])[1]

này đầu tiên sẽ nhận được các yếu tố cuốn sách với vị trí thuộc tính tương đương với 'Mỹ'. Sau đó, nó sẽ chọn nút đầu tiên từ tậ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 ý đây không phải là giống như /bookstore/book[1][@location='US'] trừ khi các yếu tố đầu tiên cũng xảy ra để có vị trí đó thuộc tính )

+0

Tôi có thể làm như thế nào với // hiệu sách/sách [@ location = 'US']? –

+7

Thao tác này sẽ nhận tất cả sách từ 'Hoa Kỳ'. (/ hiệu sách/sách [@ location = 'US']) [1] sẽ nhận được cái đầu tiên. –

+2

@KevinDriedger '/ hiệu sách/sách [@ location = 'US'] [1]' không trả lại tất cả sách từ 'Hoa Kỳ'. Tôi đã thử nghiệm nó mutiple lần và theo các ngôn ngữ khác nhau 'xpath triển khai. '/ bookstore/book [@ location = 'US'] [1]' trả về sách 'Hoa Kỳ' đầu tiên dưới một hiệu sách. Nếu có các hiệu sách của người khác, thì nó sẽ trả lại cho người đầu tiên từ mỗi nhà sách. Đây là những gì OP yêu cầu (nút đầu tiên trong cửa hàng sách). Phiên bản của bạn chỉ trả lại một cuốn sách từ tất cả các hiệu sách (kết quả đầu tiên). –

36

Như một lời giải thích để Jonathan Fingland của câu trả lời:

  • nhiều điều kiện trong ngữ tương tự ([position()=1 and @location='US']) phải đúng như một toàn bộ
  • nhiều điều kiện trong các biến vị ngữ liên tiếp ([position()=1][@location='US']) phải đúng cái khác
  • này ngụ ý rằng [position()=1][@location='US'] = [@location='US'][position()=1]
    khi [position()=1 and @location='US'] == [@location='US' and position()=1]
  • gợi ý: một duy nhất [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 Toán tử Boolean "and" và "or" và với các hàm XPath Boolean not(), true()false(). Ngoài ra, bạn có thể bọc các biểu thức con trong dấu ngoặc đơn.

+4

Đây sẽ là một thay thế cho đoạn mã xpath thứ 2, mà Jonathan Fingland lưu ý sẽ không mang lại kết quả tương tự. Bài viết gốc được yêu cầu cho nút đầu tiên khớp với bộ thu nhận, nhưng xpath này trả về một nút nếu đó là nút đầu tiên và nó có khớp nối attrib. – mirezus

+0

@alram: Điều này đúng. Cảm ơn gợi ý, tôi đã sửa đổi câu trả lời của tôi để rõ ràng hơn về điểm này. – Tomalak

+0

Tomalak, ghi chú của bạn rõ ràng hơn, nhưng câu trả lời của bạn vẫn sai. Câu trả lời đúng được chôn dưới dạng bộ chọn thứ hai trong dấu đầu dòng 3 ([@ location = 'US'] [position() = 1]). Như bạn đã chỉ ra các nhà tái cấu trúc xuống câu trả lời của Johnathan Fingland. Bạn không thể sử dụng 'và' với câu trả lời này. –

149

/bookstore/book[@location='US'][1] chỉ hoạt động với cấu trúc đơn giản.

Thêm cấu trúc và nhiều thứ khác bị hỏng.

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] mang

<book location="US">A1</book> 
<book location="US">B2</book> 

không phải là "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] không trả lại gì cả.

Với ngoặc bạn có thể nhận được kết quả câu hỏi ban đầu đã cho:

(/bookstore/category/book[@location='US'])[1] cho

<book location="US">A1</book> 

(/bookstore/category/book[@location='US'])[2] công trình như mong đợi.

+21

Điều này sẽ được chấp nhận trả lời! Tôi không thể hiểu cách câu trả lời được chấp nhận có quá nhiều upvotes ... Nó không làm việc ở tất cả khi nói đến các trường hợp phức tạp hơn ... – korda

+9

Tác giả của câu trả lời được chấp nhận ở đây. Câu hỏi của OP coi '/ bookstore/book [1] 'và NOT' (/ bookstore/book) [1] '. Trường hợp bạn đã cung cấp không giống với trường hợp mà OP yêu cầu. Có lẽ, OP chấp nhận câu trả lời của tôi như nó đã làm những gì ông mong đợi (và yêu cầu). –

+0

Câu trả lời này đã giúp tôi trong trường hợp đặc biệt này. Ai đó có thể giải thích lý do tại sao nó sẽ không xử lý "tình huống phức tạp hơn"? Vì về cơ bản nó tìm thấy một danh sách với hai mục, [2] chỉ cần nhặt nó lên (trong thế giới của tôi) – Skurpi

10

Cách dễ nhất để tìm thấy đầu tiên nút cuốn sách tiếng Anh (trong toàn bộ tài liệu), lấy được xem xét phức tạp hơn tập tin xml structered, 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 hiện xpath:

/descendant::book[@location='US'][1] 

3
<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, hãy nêu ở trên; bạn có thể chọn sách đầu tiên với

(//book[@location='US'])[1] 

Và điều này sẽ tìm thấy cuốn sách đầu tiên ở bất kỳ đâu có vị trí ở Hoa Kỳ. [A1]

//book[@location='US'] 

Sẽ trả lại tập hợp nút với tất cả các sách có vị trí Hoa Kỳ. [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 danh mục ở bất kỳ đâu trong tài liệu. [B1]

(/bookstore//book[@location='US'])[1] 

sẽ trả lại sách đầu tiên có vị trí Hoa Kỳ tồn tại ở bất kỳ đâu trong hiệu sách gốc; làm cho một phần/cửa hàng sách dư thừa thực sự. [A1]

Trong câu 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 các phần tử cuốn sách với vị trí của Mỹ đó là dưới hiệu sách [A1]

Ngẫu nhiên nếu bạn muốn, trong ví dụ này để tìm 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] 
+2

Hầu hết các ví dụ của bạn với '//' và việc sử dụng chỉ mục '[1]' là sai. '// book [@ location = 'US'] [1]' chọn cả ba cuốn sách với 'location = 'US''. '// category/book [@ location = 'US'] [1]' trả về một nút nhưng chỉ vì bạn có một nút 'category'. '/ bookstore // book [@ location = 'US'] [1]' trả về cả ba cuốn sách "Hoa Kỳ", '/ bookstore/* // book [@ location = 'US'] [1]' trên Mặt khác trả về hai nút. – matt

+1

Bạn chính xác; Tôi thiếu dấu ngoặc đơn; Tôi sẽ chỉnh sửa để thêm chúng vào ... Không chắc chắn làm thế nào tôi bị mất tất cả! – iZian

0

cho ví dụ:

<input b="demo"> 

(input[@b='demo'])[1] 
+1

Vui lòng nêu rõ lý do tại sao câu trả lời của bạn hoạt động. –

0

Với sự giúp đỡ của một trực tuyến xpath tester 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] 

kết quả đầu ra:

123 
foo 
bar 
xyz 

Kể từ 1 phương tiện chọn tất cả td yếu tố đó là những đứa con đầu lòng của cha mẹ trực tiếp của chính họ.
Nhưng xpath sau:

(id("t2")/tbody/tr/td)[1] 

kết quả đầu ra:

123 
2

Sử dụng các chỉ số để có được nút mong muốn nếu xpath là phức tạp hoặc nhiều hơn một nút hiện với cùng một xpath.

ví dụ: (// hiệu sách [@location = 'Mỹ']) [index]

bạn có thể cung cấp cho các số mà nút mà bạn muốn.

Các vấn đề liên quan