web-dev-qa-db-ja.com

Xml Schemaの属性をsimpletypeに、またはcomplextypeに制限を追加します

問題は次のとおりです。

次のXMLスニペットがあります。

<time format="minutes">11:60</time>

問題は、属性と制限の両方を同時に追加できないことです。属性形式には、分、時間、秒の値のみを含めることができます。時間にはrestrictionpattern \d{2}:\d{2}

<xs:element name="time" type="timeType"/>
...
<xs:simpleType name="formatType">
<xs:restriction base="xs:string">
    <xs:enumeration value="minutes"/>
    <xs:enumeration value="hours"/>
    <xs:enumeration value="seconds"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="timeType">
    <xs:attribute name="format">
        <xs:simpleType>
            <xs:restriction base="formatType"/>
        </xs:simpleType>
    </xs:attribute>
</xs:complexType>

TimeTypeの複合型を作成する場合、属性を追加できますが、制限は追加できません。また、単純型を作成する場合、制限を追加できますが、属性は追加できません。この問題を回避する方法はありますか。これは非常に奇妙な制限ではありませんか?

64
Ikke

拡張によって派生する必要がある属性を追加するには、制限によって派生する必要があるファセットを追加します。したがって、これは要素の子コンテンツに対して2つのステップで実行する必要があります。属性はインラインで定義できます:

<xsd:simpleType name="timeValueType">
  <xsd:restriction base="xsd:token">
    <xsd:pattern value="\d{2}:\d{2}"/>
  </xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="timeType">
  <xsd:simpleContent>
    <xsd:extension base="timeValueType">
      <xsd:attribute name="format">
        <xsd:simpleType>
          <xsd:restriction base="xsd:token">
            <xsd:enumeration value="seconds"/>
            <xsd:enumeration value="minutes"/>
            <xsd:enumeration value="hours"/>
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:attribute>
    </xsd:extension>
  </xsd:simpleContent>
</xsd:complexType>
117
Richard

属性を追加するときに継承型と制限を混在させるために実際に必要なものについて、より詳細な説明を含む私の例を提案したいと思います。

これは、継承型を定義する場所です(私の場合は、フィールド長1024の制限が適用されたxs:stringベースの型です)。フィールドに「属性」を追加するため、これをフィールドの標準タイプとして使用することはできません。

  <xs:simpleType name="string1024Type">
    <xs:restriction base="xs:string">
      <xs:maxLength value="1024"/>
    </xs:restriction>
  </xs:simpleType>

これは、プライベートタイプ(私の場合は「string1024Type」)と必要な属性に基づいて要素が定義される場所です。

<xs:element maxOccurs="unbounded" name="event">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="string1024Type">
        <xs:attribute default="list" name="node" type="xs:string"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

両方のブロックがスキーマの完全に別々の場所にある可能性があります。重要な点はもう一度従うだけです-継承と属性を同じ要素定義に混在させることはできません。

2
Oleg Kokorin