XSD 具有单一名称和不同类型的多个元素
XSD multiple elements with single name and different types
我是 XSD 的新手,我遇到了一个对我来说似乎很简单的问题......在我尝试之前。
我想为以下 XML 写一个 XSD :
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<properties>
<double name="Value1">111.111</double>
<double name="Value2">222.222</double>
</properties>
我希望这个 XSD 非常严格,以便 Value1 和 Value2 是固定的,唯一的“免费”值是 111.111 和 222.222。
我还想强制 Value1 和 Value2 出现在 XML 文件中(尽管不一定按此顺序)
所以我这样写 XSD :
<?xml version = "1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="properties">
<xs:complexType>
<xs:sequence>
<xs:element name="double">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="name" type="xs:string" fixed="Value1" use = "required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="double">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="name" type="xs:string" fixed="Value2" use = "required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
不幸的是,我的 XML 验证器给出了以下错误:
Multiple Elements With Name 'double', With Different Types, Appear In The Model Group.
我知道此类问题已为人所知,但我找不到任何方便的答案,或者只是我不明白!?而且我不能使用 XSD 1.1.
非常感谢您的帮助!
您可以定义一个带有限制的 xs:simpleType
来限制您的 @name
属性的可能值。那么你将只需要一个序列中的一个 doulbe
元素:
<?xml version = "1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="tVal">
<xs:restriction base="xs:string">
<xs:pattern value="Value1|Value2"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="properties">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="double">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="name" type="tVal" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
感谢您的回答!
它解决了我最初发布的问题。
但我忘了提到我还想强制 Value1 和 Value2 都出现在 XML 文件中(尽管不一定按该顺序)。
可能吗?
在已发布答案的细微变化中,如果您扩展 xs:ID
并使用 min/maxOccurs="2"
:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="tVal">
<xs:restriction base="xs:ID">
<xs:pattern value="Value1|Value2"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="properties">
<xs:complexType>
<xs:sequence>
<xs:element name="double" minOccurs="2" maxOccurs="2">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="name" type="tVal" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
应实施关于具有 Value1
或 Value2
的唯一 name
属性的要求。
我是 XSD 的新手,我遇到了一个对我来说似乎很简单的问题......在我尝试之前。
我想为以下 XML 写一个 XSD :
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<properties>
<double name="Value1">111.111</double>
<double name="Value2">222.222</double>
</properties>
我希望这个 XSD 非常严格,以便 Value1 和 Value2 是固定的,唯一的“免费”值是 111.111 和 222.222。
我还想强制 Value1 和 Value2 出现在 XML 文件中(尽管不一定按此顺序)
所以我这样写 XSD :
<?xml version = "1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="properties">
<xs:complexType>
<xs:sequence>
<xs:element name="double">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="name" type="xs:string" fixed="Value1" use = "required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="double">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="name" type="xs:string" fixed="Value2" use = "required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
不幸的是,我的 XML 验证器给出了以下错误:
Multiple Elements With Name 'double', With Different Types, Appear In The Model Group.
我知道此类问题已为人所知,但我找不到任何方便的答案,或者只是我不明白!?而且我不能使用 XSD 1.1.
非常感谢您的帮助!
您可以定义一个带有限制的 xs:simpleType
来限制您的 @name
属性的可能值。那么你将只需要一个序列中的一个 doulbe
元素:
<?xml version = "1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="tVal">
<xs:restriction base="xs:string">
<xs:pattern value="Value1|Value2"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="properties">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="double">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="name" type="tVal" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
感谢您的回答! 它解决了我最初发布的问题。 但我忘了提到我还想强制 Value1 和 Value2 都出现在 XML 文件中(尽管不一定按该顺序)。 可能吗?
在已发布答案的细微变化中,如果您扩展 xs:ID
并使用 min/maxOccurs="2"
:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="tVal">
<xs:restriction base="xs:ID">
<xs:pattern value="Value1|Value2"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="properties">
<xs:complexType>
<xs:sequence>
<xs:element name="double" minOccurs="2" maxOccurs="2">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="name" type="tVal" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
应实施关于具有 Value1
或 Value2
的唯一 name
属性的要求。