2016-05-11 4 views
2

クロスワードパズルのXSD 1.1にスキーマを作成しています。私の要素の1つは<dimensions>です。例:XSDの他の値に基づいてXML要素値を制限する

<xs:element name="dimensions"> 
    <xs:simpleType> 
     <xs:restriction base="xs:string"> 
     <xs:pattern value="\d+x\d+"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:element> 

結果のXMLは、パズルのグリッドは21個の正方形で21個の正方形であることを意味し、<dimensions>21x21</dimensions>ようになります。

私はまた、パズルのすべての正方形に対して<cell>要素を持っています。だから21x21の寸法のパズルの場合、私は<cell>の441のインスタンスを持つでしょう。各<cell>は、グリッド内での位置を記述する<coordinates>要素を有する:

<xs:element name="cell"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="coordinates"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:pattern value="\d+,\d+"/> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

それでグリッドの左下隅の角の位置は、それが21行であることを示す、<coordinates>21,1</coordinates>で表されるであろう、 1列目。

私は次の操作を実行したい:

  1. <dimensions>に基づいて、すべての正方形のための1 <cell>があることが必要です。たとえば、寸法が21×21の場合、<cell>のインスタンスが441個存在する必要があります。

  2. は、各<cell>ため<coordinates>がユニークであると<dimensionsのパラメータの範囲内にする必要があります。換言すれば、21×21グリッドの場合、座標の各軸は1から21の間の数字で表されなければならず、441の組み合わせはそれぞれ1回しか使用できません。

答えて

1

XSD 1.1が必要です。アサーションを使用します。または、スキーマに別の方法で制約を適用するためにスキーマをパラメータ化する必要があります(スキーマに正確に21のセルがあり、それぞれ正確に21のセルが必要です)。

+0

を、私異なるサイズのグリッド(例えば、15x15)のパズルに対応する必要があるため、正確に21行/セルを必要とするようにスキーマをパラメータ化することはできません。だから、どのようにパラメータを次元に依存させることができるアサーションを書くだろうか? – Misenus

+0

すべてのパズルに同じスキーマを正確に使用する必要がある場合は、もちろんそれをパラメータ化しても機能しません。しかし、さまざまなサイズのパズルに対応する必要があるため、パラメータ化する理由はありません。アサーションの使い方について - 今まで何を試しましたか? –

+0

私は一般的なグリッドタイプとディメンションのための一連のスキーマを作成することができたと思いますが、それはおそらく学校向けのこのプロジェクトの範囲外です。私は、単語のパズルのような構造がたくさんある従来にないテキストをエンコーディングするためのTEI由来の(TEIに由来する?)スキーマを作成しようとしています。私はほとんどアサーションを理解する(私はちょうど私がこの関連する質問を投稿した昨日のことを学んだ:http://stackoverflow.com/questions/37127791/control-element-cardinality-based-on-an-attribute-inumeration-in-xsd )、私はまだ試みていない。 – Misenus

1
はい、アサーションを使用することができる

が、XMLの設計変更が良いだろう...あなたはdimensionsに置きます

情報は、あなたのcell要素の構造によって暗示されると、自動的にを導出することができますではなく、を任意に設定してに設定してから、別途検証する必要があります。

coordinatesにも同様の議論が適用されます。

(注明示的に座標を表したいなかった場合でもまた、その、。各座標に対して個別の要素、またはより良いまだを、属性、使用する方が良いと思います)私はXSD 1.1を使用しています

+0

正しいデータ入力の実施を含む様々な理由から、私は明示的に '座標 'を表現したいと思います。したがって、各セルの座標属性、または2つの属性(各軸に1つ)を作成すると、アサーションを使用する必要がありますか?それとも別の方法がありますか? – Misenus

+0

データがXMLにヒットする前に、データ入力検証がよりよく実行されます。また、別個の属性が検証の問題に対処していないことは明らかです。私は既に[XSD 1.1アサーションの使い方]の例を示しました(http://stackoverflow.com/a/37129215/290085)。私はここでもう一度やりません。そして、率直に言えば、(1)デザインを修正する場合はここにアサーションは必要ありません。(2)あなたがそれらを望んでいると主張するならば、自分で刺すべきですそれをどのように使用するかがすでに示されています。 – kjhughes

+0

データがXMLにヒットする前に、データ入力検証がよりうまく実行されるというあなたのコメントを理解しています。これは、XMLの作成者の手に渡すために、「セル」の数と「座標」の値を制御する方法を尋ねたときに得ていたものです。だから私はアサーションを求めていませんが、アサーションを使用して明示的に座標を定義する方法で「設計を修正する」ことができるかどうかを理解していません。 – Misenus

関連する問題