2016-10-20 1 views
0

나는이 정규 구조를 가지고 :확장 XSD에 XQuery에 의해 요소의 값을 취득

<xsd:complexType name="Document"> 
    <xsd:attribute name="ID" use="optional" type="cdpscm:IDDocument"/> 
</xsd:complexType> 

<xsd:element name="NationalID" type="cdpscm:NationalID"/> 
<xsd:complexType name="NationalID"> 
    <xsd:complexContent> 
     <xsd:extension base="cdpscm:Document"> 
      <xsd:sequence> 
       <xsd:element name="Number"/> 
      </xsd:sequence> 
     </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 

<xsd:element name="Passaport" type="cdpscm:Passaport"/> 
<xsd:complexType name="Passaport"> 
    <xsd:complexContent> 
     <xsd:extension base="cdpscm:Document"> 
      <xsd:sequence> 
       <xsd:element name="Number"/> 
      </xsd:sequence> 
     </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 

문서가 Passaport 또는 NationalID 경우 캐스팅됩니다 내 OSB 서비스를 호출하지만이 숫자 값을 얼마나 전달 예를 들어 number 요소가없는 Document 요소 유형 만있는 경우와 같이 다른 서비스로 복사 할 수 있습니다. 그래서 아마 내가 NationalID 또는 Passaport, 관광 또는 원주민 사람과 함께 일하고 있는지 알고해야합니다,

<v24:Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="v2:TouristPerson" ID="5772893"> 
    <v2:Documents> 
     <v2:Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="v2:Passport"> 
      <v2:Number>03070</v2:Number> 
    </v2:Document> 
    </v2:Documents> 
</v24:Person> 

실제 구조는 이것보다 더 복잡하다 :

이것은 supossed 입력합니다.

Oracle 11g, Eclipse OEPE를 사용하십시오.

도움 주셔서 감사합니다.

답변

1

이와 비슷한 기능이 작동합니다.

declare namespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; 

let $documents := $body//v24:Person/v2:Documents/v2:Document 

for $passport in $documents[@xsi:type="v2:Passport"] 
    return data($passport/v2:Number) 

    (: similarly for national IDs :) 
+0

고마워요! –

+0

@xsi : type에 대한 테스트는 네임 스페이스 접두사의 선택에 민감합니다. 네임 스페이스 URI를 테스트하려면 QName 기계를 사용하는 것이 좋습니다. 데이터가 입력되지 않았다고 가정하면 $ documents [fn : resolve-QName (@xsi : type,.) = QName ("namespace-bound-to-v2", "Passport")]' –

관련 문제