1

XML 型のセットを共有する 2 つの開発チームの懸念を切り離したいと思います。共有タイプは、共有 XSD で定義されます。ただし、2 番目のチームは、一連の要件にのみ関連する共有 XML 型のほとんどのフィールドに追加の属性グループを必要とします。現在、これらの妥当性属性は、共有 XSD のほとんどのフィールドに埋め込まれています。

単純な OO 言語の場合と同様に、共有 XML 型を拡張する一連の XML 型にこれらの属性を分離したいと考えています。オブジェクト指向フレームワークで XML スキーマを構築する のテクニックを使用して、Ayesha Malik がいくつかのアイデアを思いつきました。

属性を追加したおかげで... ファセットを追加できたので、個々のフィールドの complexTypes に属性を追加することができました。しかし、複雑な共有型の 1 つでサブ要素の型をオーバーライドしようとすると、Eclipse の検証で次のように不平を言われます。

パーティクル タイプは、ベースのパーティクルの有効な制限ではありません。

個々のサブ要素のタイプを同じままにしておくと、非常にうまく検証されます。しかし、それらの型を新しい派生型に変更すると、検証は失敗します。個々のサブ要素の型が親の型と異なるという事実が演習の要点であるため、イライラします。親タイプのほぼすべてのフィールド/サブ要素に属性のグループを追加したいのですが、それを行う方法がわかりません。

simpleContent を使用して、属性を simpleType と complextType の両方に追加できることを示す例を分離しました。しかし、complextContent を使用して派生した complexType に属性を追加することはできません。たとえば、以下の complexType "SearchPamphlet" では、<xs:extension> と <xs:restriction> の両方を使用してみました。また、「ベース」を「本」と「パンフレット」に設定してみました。これらのアプローチはすべて同じエラーを生成します。誰か提案はありますか?

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified" attributeFormDefault="unqualified">

    <xs:complexType name="Book">
        <xs:sequence>
            <xs:element name="Title" type="xs:string" />
            <xs:element name="Author" type="xs:string" />
            <xs:element name="ISBN" type="xs:string" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Pamphlet">
        <xs:complexContent>
            <xs:restriction base="Book">
                <xs:sequence>
                    <xs:element name="Title" type="xs:string" />
                    <xs:element name="Author" type="xs:string" />
                    <xs:element name="ISBN" type="PamphletISBN" />
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>

    <xs:simpleType name="ISBNType">
        <xs:restriction base="xs:string" />
    </xs:simpleType>

    <xs:simpleType name="PamphletISBN">
        <xs:restriction base="ISBNType">
            <xs:maxLength value="5" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="SearchablePamphlet">
        <xs:complexContent>
            <xs:restriction base="Book">
                <xs:sequence>
                    <xs:element name="Title" type="SearchableString" />
                    <xs:element name="Author" type="SearchableString" />
                    <xs:element name="ISBN" type="SearchablePamphletISBN" />
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="SearchablePamphletISBN">
        <xs:simpleContent>
            <xs:extension base="PamphletISBN">
            <xs:attributeGroup ref="searchableAttributes" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="SearchableString">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attributeGroup ref="searchableAttributes" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:attributeGroup name="searchableAttributes">
        <xs:attribute name="caseMatches" type="xs:boolean" />
        <xs:attribute name="spellingMatches" type="xs:boolean" />
        <xs:attribute name="checksum" type="xs:integer" />
    </xs:attributeGroup>

</xs:schema>
4

3 に答える 3

0

私が求めていた懸念を分離する解決策を見つけました。解決策は、 substitutionGroupと組み合わせて「 SalamiSlice 」デザインパターンを使用することです。

全知で先見の明のあるアナリストがいると、ベースファイルが非常に開発上のニーズを予測できる可能性があります。または、会社の標準化委員会が、会社の開発グループがさらに別のファイルを作成するたびにベースタイプのXSDファイルを変更しても問題ない場合は、追加する要素または属性。しかし、私のキャリアの中での仕事の経験では、そのような個人やそのような標準化委員会と一緒に仕事をする機会は一度もありませんでした。

以下の懸念事項の分離を示す3つのXSDファイルと、サンプルXMLファイルを投稿しました。投稿されたコードでは、BaseTypes.xsdファイルがフリーズされ、変更レビューボードの制御下にあると想定しています。また、DerivedTypes.xsd、Products.xsd、およびTest.xmlファイルは、ローカルの製品開発グループによって作成されると想定しています。

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- XMLInheritance_BaseDataTypes -->

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://www.company.org/XMLInheritance" xmlns:bk="http://www.company.org/XMLInheritance"
      elementFormDefault="qualified" attributeFormDefault="unqualified">

      <xs:element name="Book" type="bk:BookType" />
      <xs:element name="Title" type="xs:string" />
      <xs:element name="Author" type="xs:string" />
      <xs:element name="ISBN" type="bk:ISBNType" />

      <xs:simpleType name="ISBNType">
        <xs:restriction base="xs:string" />
      </xs:simpleType>

      <xs:complexType name="BookType">
        <xs:sequence>
          <xs:element ref="bk:Title" />
          <xs:element ref="bk:Author" />
          <xs:element ref="bk:ISBN" />
        </xs:sequence>
      </xs:complexType>

    </xs:schema>


    ----------

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- XMLInheritance_DerivedDataTypes -->

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://www.company.org/XMLInheritance" xmlns:bk="http://www.company.org/XMLInheritance"
      elementFormDefault="qualified" attributeFormDefault="unqualified">

      <xs:include schemaLocation="XMLInheritance_BaseDataTypes.xsd" />

      <xs:element name="SearchableBook" type="bk:SearchableBookType"
        substitutionGroup="bk:Book" />
      <xs:element name=" SearchableTitle " type="bk:SearchableString"
        substitutionGroup="bk:Title" />
      <xs:element name="SearchableAuthor" type="bk:SearchableString"
        substitutionGroup="bk:Author" />
      <xs:element name="SearchableISBN" type="bk:SearchableISBNType"
        substitutionGroup="bk:ISBN" />

      <xs:attributeGroup name="searchableAttributes">
        <xs:attribute name="caseMatches" type="xs:boolean" />
        <xs:attribute name="spellingMatches" type="xs:boolean" />
        <xs:attribute name="checksum" type="xs:integer" />
      </xs:attributeGroup>

      <xs:complexType name="SearchableBookType">
        <xs:complexContent>
          <xs:restriction base="bk:BookType">
            <xs:sequence>
              <xs:element ref="bk:SearchableTitle" />
              <xs:element ref="bk:SearchableAuthor" />
              <xs:element ref="bk:SearchableISBN" />
            </xs:sequence>
          </xs:restriction>
        </xs:complexContent>
      </xs:complexType>

      <xs:complexType name="SearchableISBNType">
        <xs:simpleContent>
          <xs:extension base="bk:ISBNType">
            <xs:attributeGroup ref="bk:searchableAttributes" />
          </xs:extension>
        </xs:simpleContent>
      </xs:complexType>

      <xs:complexType name="SearchableString">
        <xs:simpleContent>
          <xs:extension base="xs:string">
            <xs:attributeGroup ref="bk:searchableAttributes" />
          </xs:extension>
        </xs:simpleContent>
      </xs:complexType>

    </xs:schema>


    ----------
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- XMLInheritance_DerivedProducts.xsd -->

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://www.company.org/XMLInheritance" xmlns:bk="http://www.company.org/XMLInheritance"
      elementFormDefault="qualified">
      <xs:include schemaLocation="XMLInheritance_DataTypes.xsd" />

      <xs:element name="Product">
        <xs:complexType>
          <xs:sequence>

            <xs:element name="Books">
              <xs:complexType>
                <xs:sequence maxOccurs="unbounded">
                  <xs:element name="Book" type="bk:BookType" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>

            <xs:element name="SearchableBooks" minOccurs="0">
              <xs:complexType>
                <xs:sequence maxOccurs="unbounded">
                  <xs:element name="SearchableBook" type="bk:SearchableBookType" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>

    </xs:schema>


    ----------
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- XMLInheritance_Test.xml -->
    <bk:Product xmlns:bk="http://www.company.org/XMLInheritance"
      xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
      xs:schemaLocation="http://www.company.org/XMLInheritance XMLInheritance_DerivedProducts.xsd ">

      <bk:Books>
        <bk:Book>
          <bk:Title>Title</bk:Title>
          <bk:Author>Author</bk:Author>
          <bk:ISBN>ISBN</bk:ISBN>
        </bk:Book>
      </bk:Books>
      <bk:SearchableBooks>
        <bk:SearchableBook>
          <bk:SearchableTitle>Searchable Title</bk:SearchableTitle>
          <bk:SearchableAuthor>Searchable Author</bk:SearchableAuthor>
          <bk:SearchableISBN>Searchable ISBN</bk:SearchableISBN>
        </bk:SearchableBook>
      </bk:SearchableBooks>

    </bk:Product>
于 2012-08-02T13:14:01.860 に答える
0

以下の XSD は、投稿したソースの意図と厳密に一致します。主なポイントは、XSD で制限がどのように機能するか、およびオーサリングで考慮する必要があるオーバーヘッドを理解してもらうことです。

説明するには: 既に制限されている Book の代わりに、必要なものがすべて揃ったエンティティである "SearcheableBook" から始める必要があり、そこからさまざまな制限を適用して縮小します。

<?xml version="1.0" encoding="UTF-8"?>
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:complexType name="SearchableBook" abstract="true">
        <xs:sequence>
            <xs:element name="Title" type="SearchableString"/>
            <xs:element name="Author" type="SearchableString"/>
            <xs:element name="ISBN" type="SearchableString"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Book">
        <xs:complexContent>
            <xs:restriction base="SearchableBook">
                <xs:sequence>
                    <xs:element name="Title" type="SimpleTitle"/>
                    <xs:element name="Author" type="SimpleAuthor"/>
                    <xs:element name="ISBN" type="SimpleISBN"/>
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="SimpleTitle">
        <xs:simpleContent>
            <xs:restriction base="SearchableString">
                <xs:attribute name="caseMatches" type="xs:boolean" use="prohibited"/>
                <xs:attribute name="spellingMatches" type="xs:boolean" use="prohibited"/>
                <xs:attribute name="checksum" type="xs:integer" use="prohibited"/>              
            </xs:restriction>
        </xs:simpleContent>     
    </xs:complexType>

    <xs:complexType name="SimpleAuthor">
        <xs:simpleContent>
            <xs:restriction base="SearchableString">
                <xs:attribute name="caseMatches" type="xs:boolean" use="prohibited"/>
                <xs:attribute name="spellingMatches" type="xs:boolean" use="prohibited"/>
                <xs:attribute name="checksum" type="xs:integer" use="prohibited"/>                              
            </xs:restriction>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="SimpleISBN">
        <xs:simpleContent>
            <xs:restriction base="SearchableString">
                <xs:attribute name="caseMatches" type="xs:boolean" use="prohibited"/>
                <xs:attribute name="spellingMatches" type="xs:boolean" use="prohibited"/>
                <xs:attribute name="checksum" type="xs:integer" use="prohibited"/>                              
            </xs:restriction>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="Pamphlet">
        <xs:complexContent>
            <xs:restriction base="SearchableBook">
                <xs:sequence>
                    <xs:element name="Title" type="SimpleTitle"/>
                    <xs:element name="Author" type="SimpleAuthor"/>
                    <xs:element name="ISBN" type="PamphletISBN"/>
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="PamphletISBN">
        <xs:simpleContent>
            <xs:restriction base="SearchableString">
                <xs:maxLength value="5"/>
                <xs:attribute name="caseMatches" type="xs:boolean" use="prohibited"/>
                <xs:attribute name="spellingMatches" type="xs:boolean" use="prohibited"/>
                <xs:attribute name="checksum" type="xs:integer" use="prohibited"/>                              
            </xs:restriction>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="SearchablePamphlet">
        <xs:complexContent>
            <xs:restriction base="SearchableBook">
                <xs:sequence>
                    <xs:element name="Title" type="SearchableString"/>
                    <xs:element name="Author" type="SearchableString"/>
                    <xs:element name="ISBN" type="SearchablePamphletISBN"/>
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="SearchablePamphletISBN">
        <xs:simpleContent>
            <xs:restriction base="SearchableString">
                <xs:maxLength value="5"/>
            </xs:restriction>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="SearchableString">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attributeGroup ref="searchableAttributes"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:attributeGroup name="searchableAttributes">
        <xs:attribute name="caseMatches" type="xs:boolean"/>
        <xs:attribute name="spellingMatches" type="xs:boolean"/>
        <xs:attribute name="checksum" type="xs:integer"/>
    </xs:attributeGroup>
</xs:schema> 

また、拡張機能を使用して、モデルを別の方法で考えようとしましたが、それがよりクリーンであると言える方法で実行できるかどうかを確認します (最近、市場で最も高価な XSD エディターが制限の複雑なケースで窒息する様子を見てきました。 ..)

于 2012-07-31T13:05:15.797 に答える
0

ご回答ありがとうございます。構文的に機能します。残念ながら、この答えは、派生型のセットが1 つしかないサンプル シナリオでしか機能しません。これは、複数の開発チームが共有型の共通ライブラリから作業している状況では拡張できません。

たとえば、例の型「Book」、「Pamphlet」、および「PamphletISBN 」を含む共有型の標準的な企業ライブラリがあり、ライブラリ XSD ファイルが標準プロセスによって「凍結」された状況。

そのような状況では、検索チームはBookタイプを変更することはできません。他の開発チームには競合する要件があるためです。たとえば、販売チームは「 lifeTimeSales 」、「 topRanking 」、「highestRatings 」などの属性を持ちたいと考え制作チーム monthlyPrinting」、「 numberInInventory 」などの属性を追加したいと思うかもしれませ


昨日から、要素を使用してこの要件を解決しようとしました。残念ながら、このアプローチも単一の型レベルを超えて拡張することはできません。

私が調査しようとしている別のアプローチは、置換グループを使用して、それが道を開くかどうかを確認することです. 解決策が見つかったら投稿します。

繰り返しますが、あなたの提案に感謝します。

于 2012-08-01T11:55:48.517 に答える