2011-10-06 4 views
2

스키마는 < xsd : any /> 요소를 포함합니다.xsd : any 요소를 교차하는 XQuery를 작성하는 방법은 무엇입니까?

일부 외부 정보에 따르면 코드는 특정 XML 구조 (예 : foo)가 있음을 알고 있습니다.

XQuery는/Root/Child/AnotherChild/book/title으로 표시됩니다.

그러나 XQuery는 해당 book 요소를 알 수 없으므로 XQuery는 유효하지 않습니다.

XQuery가 무엇이든 받아들이도록 쿼리를 작성하려면 < /> 장소는 런타임에 동적으로 일치시킬 수 있습니까?

환경이 중요한 경우 Java, Oracle BPEL, SOA 서버 1.1.5입니다.

답변

1
<xsd:any/> 

실제로 "모든"요소와 일치하지 않습니다. 오히려 범위 내의 스키마에서 어딘가에 선언 된 요소와 일치합니다. 어떤 :

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.com/"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:any/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

그럼에도 불구하고, 다음 쿼리가 실패합니다

import schema namespace my = "http://www.example.com/"; 
validate { <my:root><my:Child/></my:root> } 

내 때문에 : 아이가 아무데도 선언되지

예를 들어, 다음과 같은 스키마 요소가 포함 XSD를 정의합니다. 다음과 같이 스키마가 변경되었을 경우

:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.com/"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:any/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="Child" type="xs:anyType"/> 
</xs:schema> 

다음 쿼리는 성공합니다. 물론 xsd : any와 일치하는 요소는 다른 네임 스페이스에있을 수 있습니다.

+0

귀하의 경우 스키마 (xs : schema 루트 요소의 직접 하위 항목)에서 "book"및 "title"요소를 선언하면 도움이됩니까? –

+1

또한 xsd : any 태그에 processContents = "skip"속성을 추가하여 문제를 피할 수 있습니다. xsd : any와 일치하는 요소를 선언해야한다고 요구하지는 않습니다. –

1

이 책은 나를 위해 일했습니다 : // book/title.

물론 이것은 정확하지 않고 스키마에 < xsd : any>가 여러 개인 경우 사용할 수 없습니다. 내 스키마는 충분하지만.

올바른 방법 (tm)이 무엇인지 궁금합니다.

관련 문제