2011-07-06 28 views
5

Tôi có một ứng dụng nhỏ tìm kiếm trích dẫn xuất bản. Các trích dẫn có trong XML và tôi chuyển các tham số tới XSLT thông qua PHP để tìm kiếm theo các trường như công cụ hoặc tác giả. Cấu trúc trông giống như sau:XPath: Kết hợp một trong nhiều trẻ em

<publications> 
    <paper> 
     <authors> 
      <author>James Smith</author> 
      <author>Jane Doe</author> 
     </authors> 
     <year>2010</year> 
     <title>Paper 1</title> 
     (more children) 
    </paper> 
    (more papers) 
</publications> 

Khi tôi gọi mẫu của tôi trong XSLT, tôi sử dụng vị từ để xem các giấy tờ nào được hiển thị dựa trên tiêu chí tìm kiếm. Vì vậy, nếu tham số $ tác giả được thiết lập, ví dụ, tôi làm:

<xsl:apply-templates select="paper[contains(authors/author, $author)]" /> 

Vấn đề: Công việc này cho tác giả đầu tiên trong "tác giả", nhưng bỏ qua những cái sau đó. Vì vậy, trong ví dụ trên, tìm kiếm "Smith" sẽ trả về bài báo này, nhưng "Doe" không trả về gì cả.

Tôi làm cách nào để định dạng biểu thức của mình để xem tất cả các phần tử "tác giả" là "tác giả"?

Trả lời

5

Hàm contains mong đợi một chuỗi làm đối số đầu tiên, không phải là một tập hợp các nút. Với biểu thức của bạn, kết quả đầu tiên của authors/author được chuyển đổi thành một chuỗi và sau đó được chuyển đến hàm.

Thay vào đó, sử dụng một vị đó kiểm tra mỗi author nút độc lập:

<xsl:apply-templates select="paper[authors/author[contains(., $author)]]" /> 

Xem, ví dụ, giải thích hành vi này Saxon của:

+0

Cảm ơn bạn ! Làm việc như một giấc mơ. – tkm256

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