3

私のXSDスキーマでは、要素の属性またはその子のいずれかで指定できる必要な追加の値を要素に持たせたいと考えています。

例:次の要素を許可する必要があります。

<flower color="red" />

また:

<flower><color>red</color></flower>

ただし、次の要素は有効ではありません。

<flower />

と:

<flower></flower>

と:

<flower color="red"><color>blue</color></flower>

そして、私はこれをどのように達成するのか全く分かりません。

4

2 に答える 2

3

XSD 1.0 では、唯一の選択肢は、制約を散文で文書化することです。(たとえば、スキーマのスキーマで行われているように、要素の宣言に同様の制約があります。)

XSD 1.1 では、アサーションを使用して制約を文書化し、適用できます。Petru Gardea によって提案されたスキーマ ドキュメントを少し変更すると、次のようになります。

<xs:schema targetNamespace="http://example.com/colors" 
       xmlns:tns="http://example.com/colors" 
       elementFormDefault="qualified" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="flowerColor">
    <xs:restriction base="xs:normalizedString">
      <xs:minLength value="1"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="flowerVariantC">
    <xs:sequence>
      <xs:element name="color" 
                  type="tns:flowerColor" 
                  minOccurs="0"/>
    </xs:sequence>  
    <xs:attribute name="color" 
                  type="tns:flowerColor" 
                  use="optional"/>
    <xs:assert test="(./tns:color or ./@color)
        and not(./tns:color and ./@color)"/>
  </xs:complexType>

  <xs:element name="flower" type="tns:flowerVariantC"/>    
  <xs:element name="test"/>

</xs:schema>

先ほど示したスキーマ ドキュメントと次の例を考えると、Saxon は最初と 4 番目の花要素を無効として拒否します。

<test xmlns="http://example.com/colors"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://example.com/colors colors.xsd">
  <flower/>
  <flower color="red"/>
  <flower><color>blue</color></flower>
  <flower color="blue"><color>blue</color></flower>
</test>

(とは言っても、私の本能は、このデザインを不必要に複雑にすることはしないようにアドバイスすることです。色を属性にするか、それを子にするかを選択してください。それぞれがもっともらしいデザインであるという事実は、ドキュメント内での変更を許可することを意味するものではありませ。納得のデザインです。)

于 2013-02-10T19:37:40.180 に答える
1

XSD 1.0を想定すると、以下のサンプルが開始点になります。

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:simpleType name="flowerColor">
        <xsd:restriction base="xsd:normalizedString">
            <xsd:minLength value="1"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:complexType name="flowerVariantA">
        <xsd:attribute name="color" type="flowerColor" use="required"/>
    </xsd:complexType>

    <xsd:complexType name="flowerVariantB">
        <xsd:sequence>
            <xsd:element name="color" type="flowerColor"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:element name="flower" type="flowerVariantA"/>
</xsd:schema>

VariantAとBは相互に排他的であり、サンプルXMLのいずれかと一致します。両方を同時に許可することが目的の場合、XSD 1.0では、属性と要素を混在させるコンテンツの「選択」は許可されません。

また、XML要素の自己閉鎖を制御することはできません。これは、VariantAでは、以下が有効であることを意味します。

<flower color="red"></flower>
于 2013-02-09T13:36:50.290 に答える