1

是否可以定义一个可以是 keyref 或数字文字的类型?就像在任何类型化的编程语言中一样,您可以将数字文字或另一个变量的名称分配给数字变量。我正在创建一个模式来定义绘图 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>

这将允许lieralvalue或keyref ref

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

但不是两者兼而有之:

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

1 回答 1

2

该帖子与描述的内容有些不一致。第一个 XML 显示不带属性使用的颜色,然后 xsd forcolorType带有一些属性。我假设 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 的支持程度。

于 2012-07-27T19:34:31.620 回答