组参考取决于元素值

Group ref depending on element value

我想验证 xml 文件,以便根据元素的值需要一组特定的元素。

例如,我有几种标签打印机:CAB、Intermec 等。应使用 xml 文件设置配置。打印机可能只有很少的通用设置,但也应该有特定于类型的设置。

这是我当前的简化 xml 架构(目前仅适用于 2 种类型):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="printer">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="type">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="CAB"/>
              <xs:enumeration value="Intermec"/>
            </xs:restriction>
          </xs:simpleType>
         </xs:element>
        <xs:element name="connected" type="xs:string"/>
        <xs:element name="id" type="xs:string"/>
        <xs:group ref="CabSettings" minOccurs="0"/>
        <xs:group ref="IntermecSettings" minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:group name="CabSettings">
    <xs:sequence>
      <xs:element name="portname" type="xs:string"/>
      <xs:element name="baudrate" type="xs:int"/>
      <xs:element name="parity" type="xs:string"/>
    </xs:sequence>
  </xs:group>
  <xs:group name="IntermecSettings">
    <xs:sequence>
      <xs:element name="ipaddress" type="xs:string"/>
      <xs:element name="port" type="xs:integer"/>
    </xs:sequence>
  </xs:group>
</xs:schema>

这是我停止的地方。我如何要求根据类型元素值期望类型特定组出现在 xml 中?甚至有可能做这样的事情吗?可以使用 XSD 1.0 来完成吗?

XML 例子:

<printer>
    <type>CAB</type>
    <connected>true</connected>
    <id>CAB1</id>
    <portname>COM2</portname>
    <baudrate>57600</baudrate>
    <parity>NONE</parity>
</printer>

<printer>
    <type>Intermec</type>
    <connected>true</connected>
    <id>Intermec1</id>
    <ipaddress>127.0.0.1</ipaddress>
    <port>1</port>
</printer>

XSD 1.0

您必须根据元素名称区分类型。因此,您将拥有单独的 CABPrinterIntermecPrinter 元素,而不是单个 printer 元素。您可以像现在一样继续使用元素组来合并通用定义组件。

XSD 1.1

您可以使用条件类型分配来根据属性值区分 printer 的类型,或者您可以使用断言根据元素值来约束内容模型。