XSD keyref or number literal
是否可以定义一个可以是 keyref 或数字文字的类型?就像在任何类型化的编程语言中一样,您可以将数字文字或另一个变量的名称分配给数字变量。我正在制作一个模式来定义绘图 api 元素(对于另一种编程语言),并且想定义一个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <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> |
如果可以对属性施加
1 2 3 4 5 6 7 | <!-- 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
1 2 | <color value="0xFF0000" /> <!-- OK --> <color ref="dialogBorder1" /> <!-- OK --> |
但不是两者都有:
1 | <color value="0xFF0000" ref="colorXYZ" /> <!-- NOT OK --> |
帖子与描述的内容有些不一致。第一个 XML 显示不带属性使用的颜色,然后
因此以下适用于:
定义一种颜色类型,它可以是十六进制文字(例如 0xFF0000 表示鲜红色),也可以是对其他地方定义的颜色的引用
1 2 3 4 5 6 7 8 9 | <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 中的
1 2 3 4 5 6 7 8 9 10 | <!-- 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 的支持程度。