0

私は XML スキーマが初めてで、別の値に基づいて制限を設定する方法を理解しようとしています。

例えば:

"State" = RI --> 有効な値は、この状態の ABS のみです。 "State" = NC または CT の有効な値は、いずれかの状態の Y のみです。

次の xml スキーマは、状態に関係なく ABS と Y を許可しています。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

  <xs:element name="State"> 
    <xs:simpleType> 
      <xs:restriction base="xs:string"> 
        <xs:enumeration value="RI"/> 
        <xs:enumeration value="CT"/> 
        <xs:enumeration value="NC"/> 
      </xs:restriction> 
    </xs:simpleType> 
  </xs:element> 

  <xs:element name="PersonalInfo"> 
    <xs:complexType> 
      <xs:sequence> 
        <xs:element ref="State"/> 
        <xs:element ref="Car"/> 
      </xs:sequence> 
    </xs:complexType> 
  </xs:element> 

  <xs:element name="Manufacturer"> 
    <xs:simpleType> 
      <xs:restriction base="xs:string"> 
        <xs:enumeration value="MINI"/> 
      </xs:restriction> 
    </xs:simpleType> 
  </xs:element> 

  <xs:element name="Car"> 
    <xs:complexType> 
      <xs:sequence> 
        <xs:element ref="Manufacturer"/> 
        <xs:element ref="AntiLockBrakes"/> 
      </xs:sequence> 
    </xs:complexType> 
  </xs:element> 

  <xs:element name="AntiLockBrakes"> 
     <xs:simpleType> 
       <xs:restriction base="xs:string"> 
         <xs:enumeration value="ABS"/> 
         <xs:enumeration value="Y"/> 
       </xs:restriction> 
     </xs:simpleType> 
   </xs:element> 

 </xs:schema>
4

1 に答える 1

3

このクラスの制約は、個別に取得された個別の要素の値ではなく、特定の値の共起を管理するため、共起制約(またはより正確には共起)と呼ばれることがよくあります。

文脈自由文法(およびXMLドキュメントの文脈自由文法を書くための特殊な語彙を本質的に提供するスキーマ言語-DTD、Relax NG、XSDコンテンツモデルなど)は、一般的なケースでは共制約をうまく処理しません(ただし多くの場合、簡単に処理できる特殊なケースがあります)。

述語ベースの制約言語(SchematronやXSD 1.1のアサーションなど)は、述語の概念に基づいて構築されているため、多くの場合、共制約を便利に表現できます。または要素または属性-通常、ブール演算子を使用して述語を組み合わせることができます。

したがって、説明する制約を適用するための最善の策は、SchematronまたはXSD1.1のアサーションを使用することです。XSD 1.1(Schematronとは異なり)では、アサーションは、アサーションがアタッチされているタイプの要素の外側を見ることができないため、State要素とAntiLockBrakes要素の両方を含む最小の要素にアサーションを配置する必要があります。スキーマを正しく読んでいる場合、それはPersonalInfoになります。XSD 1.1スキーマは、アサーションを使用して、PersonalInfoの宣言を次のように読み取ることにより、制約を適用できます。

<xs:element name="PersonalInfo"> 
  <xs:complexType> 
    <xs:sequence> 
      <xs:element ref="State"/> 
      <xs:element ref="Car"/> 
    </xs:sequence> 
    <xs:assert test="
      (State = 'RI' and Car/AntiLockBrakes = 'Y')
      or 
      (State = ('NC', 'CT') and Car/AntiLockBrakes = 'ABS')
      "/>
  </xs:complexType> 
</xs:element>

xs:assert要素の'test'属性のアサーションは、XPath2.0を使用して表現されます。ご想像のとおり、さまざまな表現方法があります。

Schematronも同様に機能しますが、Schematron自体はテストを表現する言語を指定しません。XPath 1.0で記述されたアサーションをサポートする、またはXPath2.0を受け入れるSchematron実装を見つけるのは簡単です。

于 2013-03-09T23:47:57.307 に答える