2016-10-20 4 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要素型しか持たない場合、

これはsupossed入力されている:

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

実際の構造は、これよりも複雑なので、おそらく私がNationalIDまたはPassaport、観光客やネイティブの人と働いているかどうかを知る必要があります。

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機構を使用する方が良いでしょう。データが入力されていないと仮定すると、 '$ document [fn:resolve-QName(@xsi:type、。)= QName("名前空間に束縛されたv2 "、"パスポート " –

関連する問題