1

keyref または数値リテラルのいずれかになる型を定義することは可能ですか? 型付きプログラミング言語と同様に、数値リテラルまたは別の変数の名前を数値変数に割り当てることができます。color(別のプログラミング言語用に) 描画 API 要素を定義するスキーマを作成しており、16 進数リテラル (0xFF0000明るい赤など) または他の場所で定義された色への参照のいずれかになる型を定義したいと考えています。したがって、(XMLドキュメントで)次のことができます。

<color key="dialogBorder1">0x222222</color>
<color key="dialogFill1">0xCCCCCC</color>

<!-- later... -->
<windowTheme name="warningWindow">
  <border>
    <color>0xFF0000</color> <!-- defined literally -->
  </border>
  <fill>
    <solid>
      <color>dialogFill1</color>  <!-- defined by keyref -->
    </solid>
  </fill>
</windowTheme>

属性に制限を課すことができればchoice、次のようなことができますが、現在の (1.0) バージョンの XSD 仕様ではこれは不可能であるという印象を受けています。

<!-- I wish: -->
<xs:complexType name="colorType" >
  <xs:attrchoice>
    <xs:attribute name="value" type="HexLiteral" /> <!-- literal -->
    <xs:attribute name="ref" type="xs:string" />    <!-- keyref (defined elsewhere) -->
  </xs:attrchoice>
</xs:complexType>

どちらがlieralまたは keyrefを許可します:valueref

<color value="0xFF0000" />     <!-- OK -->
<color ref="dialogBorder1" />  <!-- OK -->

しかし、両方ではありません:

<color value="0xFF0000" ref="colorXYZ" /> <!-- NOT OK -->
4

1 に答える 1

2

投稿は、説明している内容に多少矛盾しています。最初の XML は、属性なしで使用される色を示し、次に xsd はcolorTypeいくつかの属性でオフになります。XML はあなたが望んでいたものだと思います。

したがって、以下は次の場合に機能します。

16 進数のリテラル (明るい赤の 0xFF0000 など) または他の場所で定義された色への参照のいずれかである色の種類を定義するには

    <xsd:simpleType name="ColorHex">
        <xsd:union memberTypes="xsd:string">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:pattern value="0x[0-9a-fA-F]{6}"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:union>
    </xsd:simpleType>

上記は、ColorXHTML の型と同じパターンを使用しています (インスピレーションの源を提供するためにこれを示しています)。

    <!-- sixteen color names or RGB color expression-->
    <xsd:simpleType name="Color">
        <xsd:union memberTypes="xsd:NMTOKEN">
            <xsd:simpleType>
                <xsd:restriction base="xsd:token">
                    <xsd:pattern value="#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:union>
    </xsd:simpleType>

ここでのアイデアは、ユニオンを使用することです。欠点は、HEX パターンに一致しないものはすべて文字列に一致するため、無効な HEX 構文 (たとえば、数字の欠落) が参照として渡されることです。

その他の欠点は、ターゲットにしているプログラミング言語で xsd:union がどの程度サポートされているかということです。

于 2012-07-27T19:34:31.620 に答える