XSD keyref或数字文字

时间:2012-07-26 02:21:48

标签: xsd

是否可以定义一个可以是keyref或数字文字的类型?就像在任何类型编程语言中一样,您可以将数字文字OR或另一个变量的名称分配给数字变量。我正在制作一个模式来定义绘图api元素(用于另一种编程语言),并且想要定义一个color类型,它可以是十六进制文字(例如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>

哪会允许 谎言value或keyref ref

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

但不是两个:

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

1 个答案:

答案 0 :(得分:2)

该帖子在描述的内容上有些不一致。第一个XML显示没有属性的颜色,然后colorType的xsd带有一些属性。我认为XML就是你想要的。

以下适用于:

定义一个颜色类型,可以是十六进制文字(例如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>

以上使用与XHTML中的Color类型相同的模式(我将其展示给您灵感来源):

    <!-- 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的效果如何。