2014-09-02 17 views
5

Tôi có XMLs sau:MarkLogic truy vấn dựa trên giá trị của nhiều thuộc tính của cùng một nguyên tố

sample1.xml <root> <subjectInfo> <subject id="001"/> <subject id="002" role="cross"/> </subjectInfo> </root>

sample2.xml <root> <subjectInfo> <subject id="002"/> <subject id="001" role="cross"/> </subjectInfo> </root>

tôi đang tìm kiếm các tài liệu ở đâu giá trị của id thuộc tính của subject là "001" nhưng role (nếu ở đó) của cùng một yếu tố subject không phải là "chéo" .Vì vậy, trong ví dụ của tôi kết quả phải chứa sample1.xml và không sample2.xml

tôi nghĩ các truy vấn sau đây sẽ thực hiện công việc:

<code> 
cts:search(/root, 
     cts:near-query((
      cts:element-attribute-value-query(xs:QName("subject"),xs:QName("id"),"001"), 
      cts:not-query(cts:element-attribute-value-query(xs:QName("subject"),xs:QName("role"),"cross"))),0) 

      ) 
</code> 

Nhưng nó không (trả về một chuỗi rỗng). Xin hãy cho tôi một cái.

Trả lời

3

Như @wst nói, cts:not-query trận đấu cả hai tài liệu. cts:* truy vấn khớp với các đoạn tài liệu, chứ không phải các phần phụ. Bạn có thể đối chiếu với điều kiện của mình, bằng cách lồng các constructor cts:element-attribute-value-query vào trong một số cts:element-query. Điều này sẽ khớp với sample2.xml:

cts:search(/root, 
    cts:element-query(xs:QName("subject"), 
    cts:and-query((
     cts:element-attribute-value-query(xs:QName("subject"),xs:QName("id"),"001"), 
     cts:element-attribute-value-query(xs:QName("subject"),xs:QName("role"),"cross"))))) 

Có lẽ bạn có thể điều chỉnh yêu cầu truy vấn của mình để điều này là đủ. Nếu không, bạn có thể loại trừ các tài liệu khớp với tìm kiếm này, sử dụng toán tử except. Điều này sẽ phù hợp với sample1.xml:

cts:search(/root, 
    cts:element-attribute-value-query(xs:QName("subject"),xs:QName("id"),"001")) 

except 

cts:search(/root, 
    cts:element-query(xs:QName("subject"), 
    cts:and-query((
     cts:element-attribute-value-query(xs:QName("subject"),xs:QName("id"),"001"), 
     cts:element-attribute-value-query(xs:QName("subject"),xs:QName("role"),"cross"))))) 

Nếu tài liệu của bạn có định danh duy nhất, bạn có thể thêm các chỉ số phạm vi và sử dụng một trong những cts:*-values chức năng để có được ID duy nhất cho tài liệu phù hợp với thứ hai cts:search, và sau đó sử dụng cts:not-querycts:*-range-query để loại trừ các tài liệu từ cts:search đầu tiên.

+0

Cảm ơn bạn rất nhiều. Điều đó giải thích khá nhiều. – callow

3

Tôi nghĩ rằng vấn đề là cts:not-query phù hợp trên cả hai tài liệu và do đó loại trừ chúng khỏi tập hợp kết quả.

này có thể không đủ, vì nó không phải là một truy vấn chỉ số duy nhất, nhưng bạn có thể bổ sung cts:search kết quả bằng cách lọc ra dương tính giả:

cts:search(/root, 
    cts:element-attribute-value-query(xs:QName("subject"), 
    xs:QName("id"), "001"))[subjectInfo/subject[@id='001' and not(@role='cross')] 
+0

Cảm ơn. Điều đó thực sự giúp – callow

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