2011-10-21 2 views
5

MarkLogic을 사용하지만 이것은 아마도 일반적인 XQuery 질문 일 것입니다.자식 요소를 가져 오는 방법은 있지만 자식 요소를 가져 오는 방법은 무엇입니까?

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

내가 그들의 제목 속성으로 모든 [책] 요소를 반환하려면,하지만 난 책, 예를 들어, 자손의 모든 원하지 않는다 :

나는이 [발행자]. 어떻게 이것을 정교하고 효과적인 방식으로 성취합니까?

관련 질문 : 때로는 어린이 중 일부을 받고 싶지만 다른 사람은 원하지 않을 수도 있습니다. 예 : 모든 책 요소와 게시자 자식 요소를 가져 오지만 다른 자식 요소는 가져 오지 않습니다.

감사합니다.

답변

4

(XQuery에의 하위 집합입니다 실제로는 XPath) XQuery에 /library/books/book는 기술적으로 당신이 원하는 않습니다. 일부 API는 책 요소에 대한 참조를 반환하고 제목 표시와 같이 사용자가 원하는 것을 결정하도록합니다. 그러나 많은 도구와 API는 책 요소를이 하위 요소와 함께 복사하고 데이터베이스의 경우 서버에서 클라이언트로 네트워크를 통해 전송되는 경우가 많습니다. 이 경우 기존 책 요소를 선택하지 않고 책 요소에 정보의 서브 세트가 들어있는 새 문서를 작성하려고합니다. 이렇게하려면 XQuery를에 요소 생성자를 사용할 수 있습니다

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

감사합니다. Michael! 이것은 내 마음 속에서 다른 권장 사항을 살펴본 가장 우아한 접근 방법 인 것 같습니다. – bethesdaboys

0

아래 링크에서 XQuery 선택 구문을 확인하십시오. 선택 구문을 사용하면 일반적으로 관심있는 데이터 요소를 가져 와서 원하는 형식으로 구성하고 걱정하지 않는 내용은 생략 할 수 있습니다.

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

1

아마 쉬운 방법이 있습니다 ...하지만 난 이런 일이 w 다른 아이들 OUT/속성을 복사 할 것이라 생각합니다. 경고 : -이 책 요소 세트 및 아무것도를 반환 테스트되지 않은 코드

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

덕분에,이 도움이됩니다. – bethesdaboys

0

나는 마이클 케이의에 약간 더 나은 솔루션은 각각의 원하는 속성을 열거하고 조금 더 일반적으로하지하는 것입니다 생각합니다. 주목할 점은 /@은 텍스트가 아니라 속성을 반환한다는 것입니다. 예를 들어

:

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

또는 더 일반적으로 : 그것은 더 일반화 된 방법 나에게 감각을 제공한다는 점에서

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

또한을 (를) 사용할 필요가 없습니다. 다음과 같은 경로 표현식을 사용할 수 있습니다. /library/books/book/ {@ *}

+0

나는이 접근법의 단순함을 좋아합니다. 첫 번째 반응은 x 경로에 요소가있는 이유입니다. 이 방법을 채택 할 것입니다. 감사. – Walt

관련 문제