2012-12-05 3 views
1

저는 XQuery에 대해 읽고 테스트 도구와 같이 BaseX (www.basex.org)와 saxon-HE 9.4.0.6N을 사용합니다. 다음과 같은 간단한 XML 파일의 경우 - sample.xml에 붙어 있던 스키마idref를 사용하는 XPath 표현

Basex_GUI 나는 다음과 같은 XPath 식을 입력 할 경우에
<rootab> 
    <l1> 
     <items p="a"> 
     <itema x1="10" id="abc">testa</itema> 
     <itemb x1="10" id="dfe">testb</itemb> 
     <itemc x1="10" id="jgh">testc</itemc> 
     </items> 
    </l1> 
    <l2> 
     <items p="b"> 
      <itema x1="10" xidref="abc">testa</itema> 
      <itemc x1="10" xidref="jgh">testc</itemc> 
      <itemd x1="10" xidref="abc">testA101</itemd> 
      <iteme x1="10" xidref="jgh">testB202</iteme> 
     </items> 
    </l2> 
</rootab> 

: //idref("abc")/.. 결과는 다음과 같습니다 BaseX_GUI에서 <itema x1="10" xidref="abc">testa</itema>

내가 추가하는 경우를 간단한 XQuery 표현식은 :

for $x in doc('sample.xml')//idref("abc")/.. 
    return <aaa>{$x}</aaa> 

결과는 다음

01,

q1) 왜 XPath식이 하나의 노드 만 반환 했습니까? 나는 아래 XQL 파일을 사용하여, 두 ... 색슨에서

예상 :

<?xml version="1.0" encoding="UTF-8"?><test/> 

:

<test> 
    { 
    doc('sample.xml')//idref("abc")/.. 
    } 
    </test> 

또는 XQuery 표현식을, 나는 명령 query sample.xql을 실행하여 동일한 결과를받을 q2) 색슨 테스트에서 무엇이 잘못 되었습니까?

귀하의 도움에 미리 감사드립니다.

답변

2

기본적으로 idref()은 DTD 유효성 검사에 민감합니다. DTD에서 IDREF 유형으로 선언 된 속성을 인식합니다.

DTD를 표시하지 않았습니다. 더 중요한 것은 쿼리에 대한 입력이 어떻게 제공되는지를 보여주지 않았기 때문입니다. 속성의 "IDREF-ness"가 손실되는 입력을 구성하는 여러 가지 방법이 있습니다 (예 : DOM을 통해 이동하는 경우). Saxon에서 doc() 함수를 사용하는 경우에도 입력 트리가 빌드되는 방식은 구성 옵션과 URIResolver를 비롯한 여러 요소에 따라 다릅니다.

.NET을 사용하고 있습니다. Saxon이 .NET에서 Microsoft XML 파서를 사용할 때 어떤 속성이 ID와 IDREF인지 모르기 때문에 id()idref() 함수가 작동하지 않습니다. MS 파서는이 정보를 제공하지 않습니다. 따라서 Saxon 제품과 함께 제공되는 JAXP 파서 (Xerces)를 사용해야합니다. 요즘은 이것이 기본값이라고 생각합니다.

정말 답이 아니라 잘못 될 수있는 몇 가지 배경에 대한 설명입니다.

+0

DTD가 없습니다 ... 책에서 일부 장을 읽은 후에 sample.xml이 작성되었습니다. – dag

+0

DTD가없고 스키마가없는 경우 시스템은 IDREF 속성 인 속성을 알 수 없기 때문에 idref() 함수는 아무 것도 반환하지 않습니다. –

+0

내 자신의 DTD를 작성하는 경우 Saxon과 함께 명령 줄에서 내부 DTD 또는 외부 참조를 사용할 수 있습니까? (예 : query -useDTD : x sample.xql). 하지만 프로그래밍 방식으로 .Net에서? DTD 파일은 내가 필요로하는 것, 즉 IDREF 타입과 같이 선언 될 수있는 속성들만을 가지고 있다고 가정한다. 고마워요! – dag