2012-04-11 3 views
0

拡張(拡張)XML Schema要素を元の要素の形式に変換する方法を見つけようとします。例のシナリオは以下の通りです:XQueryでXMLスキーマ型から他のXML Schema型に変換する

<?xml version="1.0" encoding="UTF-8"?> 
<schema targetNamespace="http://www.example.com/address" 
     xmlns="http://www.w3.org/2001/XMLSchema" 
     xmlns:add="http://www.example.com/address" 
     elementFormDefault="qualified"> 

<complexType name="Address"> 
    <sequence> 
    <element name="name" type="string"/> 
    <element name="street" type="string"/> 
    <element name="city" type="string"/> 
    </sequence> 
</complexType> 

<complexType name="UKAddress"> 
    <complexContent> 
    <extension base="add:Address"> 
     <sequence> 
     <element name="postcode" type="ipo:UKPostcode"/> 
     </sequence> 
     <attribute name="exportCode" type="positiveInteger" fixed="1"/> 
    </extension> 
    </complexContent> 
</complexType> 

<simpleType name="UKPostcode"> 
    <restriction base="string"> 
     <pattern value="[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][A-Z]{2}"/> 
    </restriction> 
</simpleType> 

<element name="UKAddress" type="add:UKAddress" /> 
<element name="Address" type="add:Address" /> 
</schema> 

これはスキーマである、と私はこのtransfromしよう:この中へ

<UKAddress xmlns="http://www.example.com/address" exportCode="1"> 
    <name>Address1</name> 
    <street>Example street</street> 
    <city>London</city> 
    <postcode>AA00 0AA</postcode> 
</UKAddress> 

<UKAddress xmlns="http://www.example.com/address"> 
    <name>Address1</name> 
    <street>Example street</street> 
    <city>London</city> 
</UKAddress> 

児のすべてを変換しません要素を1つずつ(これはうまくいきますが)キャストのような一般的な方法で使用します。要点は、Address要素の継承のような構造を使用し、map(Xquery)とleaf要素の間の高い結合を避けることです。私はいくつかのキャスト関数を見つけようとしましたが、それらはプリミティブのためのものです。私はxsi:typeを使用しようとしましたが、すべての子要素に質問してフィルタリングしようとしました。私は働く方法を見つけませんでした。誰かがこれで会ったことがありますか?ありがとう!

答えて

0

昨日私は答えでいくつかのラウンドを持っていました。最初は、私は私に子要素をフィルタリングするXPathクエリを、作ってみました、次のように:

declare function xf:testAddress($uKAddress1 as element()) 
    as element() { 
     let $UKAddress := $uKAddress1 
     return 
      <ns0:Address> 
       {$UKAddress/*[local-name()=('name', 'street', 'city')]} 
      <ns0:Address> 
}; 

(ローカル名は重要です:単純な名前()名前空間が含まれているか、最悪ます:ダミーエンジンがこのようなものを使用する場合は名前空間)問題は、式の右辺が動的ではなく、XQueryがスキーマをヘルプなしで表示できないことです。これにより

http://en.wikibooks.org/wiki/XQuery/XML_Schema_to_Instance

、私はアドレスのダミーインスタンスを作ることができ、その後、私は子供をマッピングするために、このインスタンスを使用することができます。これを解決するための可能な方法は、以下のスクリプトです。だから、それは一種の解決策ですが、それは正しい方法ではないと思います。そして、これはすべてのリクエストで多くの余分な作業が必要になります。

関連する問題