1

<option selected>XSDでHTMLに相当するものを指定することは可能ですか?正確に、 1つの要素だけが特定の属性を持っていますか?

たとえば、次のXMLフラグメントの例を考えます。

<foo-list>
  <foo/>
  <foo bar="bar"/>
  <foo/>
</foo-list>

次のXSDを記述して、1つだけfooが存在することを確認でき@barます。

<xs:element name="foo-list">
  <!-- FOO-LIST contains [1..n] FOO elements -->
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="foo" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <!-- any FOO with @BAR must have unique @BAR -->
  <xs:unique name="oneFooBar">
    <xs:selector xpath="foo"/>
    <xs:field xpath="@bar"/>
  </xs:unique>
</xs:element>
<xs:element name="foo">
  <xs:complexType>
    <!-- FOO has optional @BAR -->
    <xs:attribute name="bar">
      <xs:simpleType>
        <!-- @BAR must = "bar", if specified -->
        <xs:restriction base="xs:string">
          <xs:enumeration value="bar"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>
</xs:element>

enumerationすべてが適切に認定されており、の代わりにソリティアを使用するという私の決定は正しいと仮定しますpattern

1)このスキーマは、私が意図したものを意味しますか?(つまり、0または1つと<foo bar="bar"/>0以上<foo/>があります<foo-list>

2)正確に1つあることを要求する方法はあり<foo bar="bar"/>ますか?

4

1 に答える 1

0

1)はい、「奇妙な」回避策のような方法で行います。

2)ストックXSD1.0ではありません。Schematronを投入すれば、準備は完了です。または、アサーションを使用してXSD 1.1に移行します(これにより、Schematronが必要なことを正確に実行できます)。重要なのは、ターゲットプラットフォームを指定していないため、XSD 1.1の実装を入手するのは難しいことです(JavaにはXercesで無料のオプションがあり、Saxon EEで有料です)が、.NETなどの他の実装には無料のものがありません。Schematronの「コンパイラ」は、実際にはスキーマをXSLTに変換したものにすぎません。1.0または2.0にすることができます。これは、事実上すべての(合理的な)プラットフォームで通常のXSD1.0を拡張するために使用できることを意味します。

于 2012-11-02T03:23:14.183 に答える