是否可以定义一个可以是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 -->
答案 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的效果如何。