4

複数のアドレスを含む XML スキーマがあります。

<xs:element name="personal_address" maxOccurs="1">
  <!-- address fields go here -->
</xs:element>
<xs:element name="business_address" maxOccurs="1">
  <!-- address fields go here -->
</xs:element>

各住所要素内に、「米国の州」列挙を含めます。

<xs:simpleType name="state">
    <xs:restriction base="xs:string">
        <xs:enumeration value="AL" />
        <xs:enumeration value="AK" />
        <xs:enumeration value="AS" />
                ....
            <xs:enumeration value="WY" />
        </xs:restriction>
</xs:simpleType>

「US State」列挙を一度書き、それを各住所要素で再利用するにはどうすればよいですか? これが未熟な質問である場合は、事前にお詫び申し上げます。これまで XSD を作成したことがありません。

私の最初の刺し傷は次のとおりです。

<xs:element name="business_address" maxOccurs="1">
  <!-- address fields go here -->
  <xs:element name="business_address_state" type="state" maxOccurs="1"></xs:element>
</xs:element>
4

2 に答える 2

5

I think you are on the right tracks. I think its more to do with XML namespaces. Try the following:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/foo"
    xmlns:tns="http://www.example.org/foo"
    elementFormDefault="qualified">
    <xs:element name="business_address">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="business_address_state"
                    type="tns:state" maxOccurs="1" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="state">
        <xs:restriction base="xs:string">
            <xs:enumeration value="AL" />
            <xs:enumeration value="AK" />
            <xs:enumeration value="AS" />
            <xs:enumeration value="WY" />
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

Note that the type is tns:state not just state

And then this is how you would use it:

<?xml version="1.0" encoding="UTF-8"?>
<business_address xmlns="http://www.example.org/foo"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/foo foo.xsd ">
    <business_address_state>AL</business_address_state>
</business_address>

Notice that this XML uses a default namespace the same as the targetNamespace of the XSD

于 2008-10-22T20:57:12.433 に答える
2

名前空間はスキーマを整理して競合を防ぐのに役立ちますが、再利用を可能にするのは上記の名前空間ではなく、グローバル型にする <xs:schema> ルートの直接の子としての型の配置です。(名前空間修飾子なしの名前空間内で、および tns: 修飾子付きで tns 名前空間が見える場所ならどこからでも使用できます。)

私は「エデンの園」アプローチに従ってスキーマを構築することを好みます。これにより、要素と型の両方の再利用が最大化されます (また、データベースに格納されたデータ ディクショナリから、慎重に作成された一意の型/要素の外部論理参照も容易になります)。 .

"Garden of Eden" スキーマ パターンは最大限の再利用を提供しますが、最も多くの作業を伴うことに注意してください。この投稿の最後に、ブログ シリーズで取り上げた他のパターンへのリンクを示します。

エデンの園アプローチ http://blogs.msdn.com/skaufman/archive/2005/05/10/416269.aspx

すべての要素をグローバルに定義するモジュラー アプローチを使用し、ベネチアン ブラインド アプローチと同様に、すべての型定義をグローバルに宣言します。各要素は、ノードの直接の子としてグローバルに定義され、その type 属性は、指定された複合型の 1 つに設定できます。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="TargetNamespace" xmlns:TN="TargetNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="BookInformation" type="BookInformationType"/>
    <xs:complexType name="BookInformationType">
        <xs:sequence>
            <xs:element ref="Title"/>
            <xs:element ref="ISBN"/>
            <xs:element ref="Publisher"/>
            <xs:element ref="PeopleInvolved" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="PeopleInvolvedType">
        <xs:sequence>
            <xs:element name="Author"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="Title"/>
    <xs:element name="ISBN"/>
    <xs:element name="Publisher"/>
    <xs:element name="PeopleInvolved" type="PeopleInvolvedType"/>
</xs:schema>
このアプローチの利点は、スキーマを再利用できることです。要素と型の両方がグローバルに定義されているため、両方を再利用できます。このアプローチは、再利用可能なコンテンツを最大限に提供します。欠点は、スキーマが冗長であることです。これは、特に拡張性とモジュール性に関連して、スキーマ要素と型の範囲、および他のスキーマでのそれらの使用について想定する余裕がない一般的なライブラリを作成する場合に適切な設計です。


すべての異なるタイプと要素には単一のグローバル定義があるため、これらの正規粒子/コンポーネントをデータベース内の識別子に 1 対 1 で関連付けることができます。一見すると、テキストの XSD パーティクル/コンポーネントとデータベースとの間の関連付けを維持するのは面倒な継続的な手動タスクのように思えるかもしれませんが、SQL Server 2005 は実際には、次のステートメントを介して正規のスキーマ コンポーネント識別子を生成できます。

CREATE XML SCHEMA COLLECTION

http://technet.microsoft.com/en-us/library/ms179457.aspx

逆に、正規粒子からスキーマを構築するために、SQL Server 2005 は

SELECT xml_schema_namespace function

http://technet.microsoft.com/en-us/library/ms191170.aspx

ca·non·i·cal 数学関連。(方程式、座標などについて) 「最も単純な、または標準的な形式で」 http://dictionary.reference.com/browse/canonical

その他、構築は簡単ですが、再利用可能性が低く、「非正規化/冗長」なスキーマ パターンには次のものがあります。

ロシアンドール アプローチhttp://blogs.msdn.com/skaufman/archive/2005/04/21/410486.aspx

スキーマには、単一のグローバル要素 (ルート要素) があります。他のすべての要素とタイプは、それぞれのタイプがその上のタイプに適合するため、名前を付けて、徐々に深くネストされます。この設計の要素はローカルで宣言されているため、インポートまたはインクルード ステートメントを使用して再利用することはできません。

サラミ スライス アプローチ http://blogs.msdn.com/skaufman/archive/2005/04/25/411809.aspx

すべての要素はグローバルに定義されますが、型の定義はローカルに定義されます。このようにして、他のスキーマは要素を再利用できます。このアプローチでは、ローカルに定義されたタイプを持つグローバル要素が、要素のコンテンツの完全な説明を提供します。この情報「スライス」は個別に宣言されてから集約され、他のスキーマを構築するためにつなぎ合わされることもあります。

ベネチアン ブラインドのアプローチ http://blogs.msdn.com/skaufman/archive/2005/04/29/413491.aspx

どちらも単一のグローバル要素を使用するという点で、ロシアンドールのアプローチに似ています。ベネチアン ブラインド アプローチは、すべての型定義をグローバルに命名および定義することによるモジュラー アプローチを記述します (要素をグローバルに宣言し、型をローカルに宣言するサラミ スライス アプローチとは対照的です)。グローバルに定義された各タイプは、個々の「スラット」を記述し、他のコンポーネントで再利用できます。さらに、ローカルで宣言されたすべての要素は、スキーマの上部にある elementFormDefault 属性の設定に応じて、名前空間を修飾することも、名前空間を修飾しないこともできます (スラットは「開く」または「閉じる」ことができます)。

于 2008-10-24T05:54:25.843 に答える