2014-09-02 3 views
5

나는 다음과 같은 XMLS 있습니다Marklogic 쿼리

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>

id 속성의 값이 subject 인 경우 subjectsubject 요소의 "001"이지만 role (해당되는 경우) 요소는 "교차"가 아닙니다. 따라서, 예에서는 결과에가 포함되어야합니다

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

하지만하지 (빈 시퀀스를 반환) 않습니다 sample2.xml

아니라 나는 다음과 같은 쿼리가 일을 할 거라 생각 했어요. 저 한테주세요.

답변

3

@wst 말한 것처럼, cts:not-query 경기 두 문서를. cts:* 쿼리는 하위 트리가 아닌 문서 조각과 일치합니다. cts:element-attribute-value-query 생성자를 cts:element-query 안에 중첩시켜 조건과 정반대로 일치시킬 수 있습니다. 이 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"))))) 

아마도 당신은 당신의 쿼리 요구 사항을 조정할 수 있습니다. 그렇지 않은 경우 except 연산자를 사용하여이 검색과 일치하는 문서를 제외 할 수 있습니다. 이 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"))))) 

문서, 당신은 범위 인덱스를 추가하고 두 번째 cts:search 일치하는 문서의 고유 ID를 얻기 위해 cts:*-values 기능 중 하나를 사용하여, 다음에 cts:not-querycts:*-range-query를 사용할 수있는 고유 식별자가있는 경우 먼저 cts:search에서 문서를 제외하십시오.

+0

대단히 감사합니다. – callow

3

나는 문제가 cts:not-query이 두 문서에서 일치하므로 결과 집합에서 제외한다고 생각합니다. 이 인덱스 만 쿼리하지 이후

이 충분하지 않을 수 있습니다,하지만 당신은 잘못된 반응을 필터링하여 cts:search 결과를 보완 할 수 :

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

감사합니다. 정말 도움이됩니다. – callow