0

拡張された (「拡張」) XML スキーマ要素を元の要素の形式に変換する方法を見つけようとしています。シナリオの例は次のとおりです。

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

これはスキーマであり、私はこれから変換しようとします:

<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 要素の継承に似た構造を何らかの方法で使用し、マップ (Xquery) とリーフ要素の間の高い結合を回避することです。キャスト関数を見つけようとしましたが、それらはプリミティブ用であり、xsi:type を使用しようとし、すべての子要素に問い合わせて、それらをフィルタリングしようとしました。作業方法が見つかりませんでした。誰もこれに会ったことがありますか?ありがとう!

4

1 に答える 1

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

(local-name は重要です: 単純な name() には名前空間が含まれます。エンジンがこのようなものを使用する場合、最悪の場合: ダミーの名前空間になります) 問題は、式の右側が動的ではなく、もちろん XQuery が助けなしではスキーマを見ることができません。これを解決するために考えられる方法は、次のスクリプトです。

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

これにより、Address のダミー インスタンスを作成し、このインスタンスを使用して子をマップできます。これは一種の解決策ですが、正しい方法ではないと思います。これには、要求ごとに多くの余分な作業が伴います。

于 2012-04-12T09:09:58.267 に答える