组参考取决于元素值
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
您必须根据元素名称区分类型。因此,您将拥有单独的 CABPrinter
和 IntermecPrinter
元素,而不是单个 printer
元素。您可以像现在一样继续使用元素组来合并通用定义组件。
XSD 1.1
您可以使用条件类型分配来根据属性值区分 printer
的类型,或者您可以使用断言根据元素值来约束内容模型。
我想验证 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
您必须根据元素名称区分类型。因此,您将拥有单独的 CABPrinter
和 IntermecPrinter
元素,而不是单个 printer
元素。您可以像现在一样继续使用元素组来合并通用定义组件。
XSD 1.1
您可以使用条件类型分配来根据属性值区分 printer
的类型,或者您可以使用断言根据元素值来约束内容模型。