2011-10-21 22 views
5

Sử dụng MarkLogic nhưng đây có thể là câu hỏi XQuery chung.Làm thế nào để có được các yếu tố con nhưng không có con cái của họ?

tôi có:

<library> 
    <books> 
    <book title="whatever"> 
     <publisher>Random</publisher> 
     ....more children 
    </book> 
    <book title="another"> 
     <publisher>Simon</publisher> 
     ....more children 
    </book> 
    ... 
    </books> 
</library> 

Tôi muốn trả lại tất cả các [sách] yếu tố với các thuộc tính tiêu đề của họ, nhưng tôi không muốn bất cứ đứa trẻ của cuốn sách, ví dụ [nhà xuất bản]. Làm thế nào để tôi thực hiện điều này một cách chính thống và thực hiện?

Câu hỏi tương quan: đôi khi tôi có thể muốn nhận được một số trẻ em, nhưng không phải là số khác, ví dụ: có được tất cả các yếu tố cuốn sách và các yếu tố con của nhà xuất bản của chúng, nhưng không ai trong số những đứa trẻ khác.

Cảm ơn.

Trả lời

4

Các XQuery (thực sự là một XPath, mà là một tập hợp con của XQuery) /library/books/book kỹ thuật làm những gì bạn muốn - nó trả về một tập hợp các yếu tố cuốn sách, và không có gì khác. Một số API sẽ trả về các tham chiếu đến các phần tử của sách và để bạn quyết định bạn muốn làm gì với chúng, ví dụ như hiển thị tiêu đề của sách. Tuy nhiên, nhiều công cụ và API sẽ sao chép các phần tử sách này cùng với toàn bộ cây con bắt nguồn từ cuốn sách và trong trường hợp cơ sở dữ liệu, điều này thường là kết quả sẽ được truyền qua mạng từ máy chủ đến máy khách. Trong trường hợp này, bạn không muốn chọn các phần tử sách hiện có, bạn muốn xây dựng một tài liệu mới có chứa một tập con của thông tin trong các phần tử sách. Để làm điều này bạn có thể sử dụng nhà thầu yếu tố trong XQuery:

for $b in /library/books/book 
return <book title="{$b/@title}"/> 
+0

Cảm ơn Michael! Đây có vẻ là cách tiếp cận thanh lịch nhất, trong tâm trí của tôi, đã xem xét các khuyến nghị khác. – bethesdaboys

0

Kiểm tra cú pháp chọn XQuery tại liên kết bên dưới. Chọn cú pháp thường cho phép bạn lấy các phần tử dữ liệu mà bạn quan tâm, định dạng nó theo cách bạn muốn và bỏ qua những thứ bạn không quan tâm.

http://www.w3schools.com/xquery/xquery_select.asp

1

Có nhiều cách có thể dễ dàng hơn ... nhưng tôi nghĩ rằng một cái gì đó như thế này sẽ sao chép các thuộc tính w/ra những đứa trẻ khác. Cảnh báo: Mã chưa được kiểm tra

for $i in doc()//book 
return <book>{ 
    for $a in $i/@* 
    return $a 
}</book> 
+0

Cảm ơn, đây là hữu ích ở chỗ nó cung cấp cho tôi một cảm giác cho một cách tiếp cận tổng quát hơn. – bethesdaboys

0

Tôi nghĩ rằng một giải pháp tốt hơn một chút để Michael Kay sẽ không liệt kê mỗi thuộc tính mong muốn và làm cho nó hơi tổng quát hơn. Điều cần lưu ý là /@ trả về thuộc tính chứ không chỉ văn bản.

Ví dụ:

for $book in /library/books/book return <book>{$book/@*}</book> 

hoặc thậm chí tổng quát hơn:

for $book in /library/books/book return element book {$book/@*} 
+2

Bạn cũng không phải sử dụng. Bạn chỉ có thể sử dụng biểu thức đường dẫn như sau: /thư viện/sách/sách/ {@ *}

+0

Tôi thích sự đơn giản của cách tiếp cận đó. Phản ứng đầu tiên của tôi, tuy nhiên, là lý do tại sao bạn có một yếu tố trong x-path của bạn? Tôi nghĩ tôi sẽ áp dụng cách tiếp cận này. Cảm ơn. – Walt

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