1

その型が参照されている場所で型のカーディナリティを定義する方法はありますか?

<xs:complexType name="xyType">
  <xs:element name="xy" maxOccurs="1">
            <xs:choice maxOccurs="1" minOccurs="0">
                <xs:complexType>
                    <xs:choice maxOccurs="unbounded" minOccurs="0">
                        ...
                    </xs:choice>
                </xs:complexType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

たとえば、この型を参照する要素を持つ 2 つの型 A と B がありますが、あるケースでは 1 つの xy のみを許可し (上記のように)、別のケースでは複数の xy を許可したいと考えています (上記の xy の maxOccurs を変更した場合など)。 「無制限」に)。

実際には、この型の定義は非常に長く複雑であるため、xyType (単一) と xyType (無制限) の complexType 定義を完全に分離する必要はありません。

可能であれば、あまりにも多くの型を定義したくありません (内部の complexType を本体から分離し、その型を参照する 2 つの型を持つなど)。これは、私の特定のシナリオでも非常に複雑になります (スキーマで定義しようとする複雑なクラス階層があるため、すべてがすでに肥大化しています)。

したがって、基本的には、このタイプを参照しているタイプがカーディナリティを処理しているものを探しています。

4

2 に答える 2

1

の部分をできるだけモジュール化して、xyType2 つのタイプ間で共有できるようにすることをお勧めします。たとえばxyType_A、 は 1 つだけxyxyType_B許可し、 は無制限xyの数を許可します。(もちろん、これらのスタンドインではなく、意味的に適切な名前を選択してください。)

たとえば、xyType_AとはのカーディナリティのxyType_B定義が異なる可能性がありますが、 で定義されている複雑な機構を共有しています。xycommonType

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

  <xs:complexType name="xyType_A">
    <xs:sequence>
      <xs:element name="xy"  type="commonType" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="xyType_B">
    <xs:sequence>
      <xs:element name="xy"  type="commonType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="commonType">
    <xs:choice maxOccurs="1" minOccurs="0">
      <xs:sequence>
        <xs:choice maxOccurs="unbounded" minOccurs="0">
          <!-- further complicated structures continue here -->
        </xs:choice>
        <!-- and here or wherever -->
     </xs:sequence>
    </xs:choice>
  </xs:complexType>

</xs:schema>

さまざまなカーディナリティの要素が定義階層のより深いところにある場合、原則 (機会の大きさではないにしても) は同じです。共通の定義コンポーネントをできるだけ多く因数分解し、明確に定義されたタイプでそれらを再利用します。

于 2013-10-29T17:12:16.037 に答える
0

これは XSD 1.0 では機能しません。Schematron (XSD 1.0 の上) を使用できます。問題なく動作します。

XSD 1.1 で可能です。少なくとも私の理解に基づいて、少し作業が必要です。解決策は、アサーションを使用することです。ただし、それらは複雑な型と単純な型でのみサポートされているようです。つまり、要素 A と B に固有の 2 つの新しい型を導入する必要があるかもしれません。ただし、A と B に固有のアサーションを定義する場所を提供する目的で、単に xyType を拡張するだけです (100% 再利用)。

いずれかの選択肢に興味がある場合は、質問に適切なタグを付けてください。

于 2013-10-29T15:57:22.957 に答える