2017-09-28 4 views
1

を制限し、このポストは、ポストの拡張である:Restrict the attribute value and the value of the element using XSDは、XMLリクエスト属性値と要素値の数

今、私はXSDを使用して、すべての属性&要素の値を制限することができますよ。しかし、私は現在、要素の値のうちの1つまたは2つだけを制限し、それらのすべてを制限するつもりはない。

XML:

<response src="XML"> 
    <resp name="JSON">letter.c</resp> 
    <resp name="SWAGGER">di.js</resp> 
    <resp name="BI">bi.j</resp> 
</response> 

XSD:それはそれで、以下の値を持つ場合

<xs:schema attributeFormDefault="unqualified" 
      elementFormDefault="qualified" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="response"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="resp" maxOccurs="14" minOccurs="1"> 
        <xs:complexType> 
         <xs:simpleContent> 
          <xs:extension base="respFilter"> 
           <xs:attribute name="name" use="required" 
               type="Enum" /> 
          </xs:extension> 
         </xs:simpleContent> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:attribute name="src" use="required"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:enumeration value="XML"></xs:enumeration> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:attribute> 
     </xs:complexType> 
    </xs:element> 
    <xs:simpleType name="Enum"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="JSON"> 
      </xs:enumeration> 
      <xs:enumeration value="SWAGGER"> 
      </xs:enumeration> 
      <xs:enumeration value="BI"> 
      </xs:enumeration> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:simpleType name="respFilter"> 
     <xs:restriction base="xs:string"> 
      <xs:minLength value="0"></xs:minLength> 
      <xs:maxLength value="1064"></xs:maxLength> 
      <xs:enumeration value="letter.c"/> 
      <xs:enumeration value="di.js"/> 
      <xs:enumeration value="bi.j"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

このXSDのみ上記のXML要求を許可します。

しかし、私は」 XSDが以下のすべての要求を検証するように、いくつかの要素値を動的に許可することです。

1.

<response src="XML"> 
    <resp name="JSON">letter.c</resp> 
    <resp name="SWAGGER"></resp> 
    <resp name="BI">bi.j</resp> 
</response> 

2.

<response src="XML"> 
    <resp name="JSON">letter.c</resp> 
    <resp name="SWAGGER">23.x</resp> 
    <resp name="BI">bi.j</resp> 
</response> 

3.

<response src="XML"> 
    <resp name="JSON">letter.c</resp> 
    <resp name="SWAGGER">di.js</resp> 
    <resp name="BI">dj.c</resp> 
</response> 

だから、基本的には、属性JSONは常に、中letter.c以外のものをletter.cを持っていますJSONはXSDによって破棄されるべきです。一方、属性SWAGGER & BIは、その中に任意の値または空の値を持つことができます。

+0

あなたがしようとしていることを十分に理解していなくても、検証のためにXSD 1.1が必要なように感じます。 (1)それは選択肢ですか? (2)あなたの要件は不明です。最小限には、JSONのletter.c以外のものはXSD *によって破棄されるべきであることを説明してください。 XSDが*バリデーション*であることを認識し、何も破棄しません。 – kjhughes

+0

1. XSD 1.1はオプションではありません。 2. letter.c以外のものがJSONの値として提供された場合、XSDによって検証されるべきではないと言っていました。それを私が間違った言葉を捨てました。 – Sierra

答えて

0

@nameの値ごとにバリデーションを変更するには、XSD 1.1のアサーションまたは条件付きタイプの割り当てが必要です。あなたはXSD 1.0に制限されている場合は、XSDに対して、アウトオブバンドあなたの制約をテストする必要があります、またはあなたはそれがあまりメタ作るためにあなたのXMLを再設計する必要があります:

<response src="XML"> 
    <JSON>letter.c</JSON> 
    <SWAGGER>di.js</SWAGGER> 
    <BI>bi.j</BI> 
</response> 

これをXMLはJSONの固定値とXSD 1.0のSWAGGERBIの列挙型を使用できます。

関連する問題