将文档中所有出现的 xsd 枚举限制为一个值
Restrict xsd enumeration to one value for all occurrences inside a document
我想定义一个包含枚举的 xsd 模式。然而,枚举的值在整个文档中应该是唯一的。为了说明这一点,请考虑以下架构:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="urn:enumtest" targetNamespace="urn:enumtest" elementFormDefault="qualified">
<xs:simpleType name="Country">
<xs:restriction base="xs:string">
<xs:enumeration value="CH"/>
<xs:enumeration value="AT"/>
<xs:enumeration value="DE"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="Address">
<xs:sequence>
<xs:element name="Street" type="xs:string"/>
<xs:element name="No" type="xs:integer"/>
<xs:element name="Code" type="xs:integer"/>
<xs:element name="Country" type="Country"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Items">
<xs:sequence>
<xs:element name="Address" type="Address" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Document">
<xs:complexType>
<xs:sequence>
<xs:element name="Items" type="Items"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
以下两个文档应该通过验证,因为它们每个都包含文档中 Country
枚举的唯一值(第一个文档中的 CH,第二个文档中的 AT):
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:enumtest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:enumtest enumtest.xsd">
<Items>
<Address>
<Street>Street1</Street>
<No>1</No>
<Code>1</Code>
<Country>CH</Country>
</Address>
<Address>
<Street>Street2</Street>
<No>2</No>
<Code>2</Code>
<Country>CH</Country>
</Address>
<Address>
<Street>Street3</Street>
<No>3</No>
<Code>3</Code>
<Country>CH</Country>
</Address>
</Items>
</Document>
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:enumtest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:enumtest enumtest.xsd">
<Items>
<Address>
<Street>Street1</Street>
<No>1</No>
<Code>1</Code>
<Country>AT</Country>
</Address>
<Address>
<Street>Street2</Street>
<No>2</No>
<Code>2</Code>
<Country>AT</Country>
</Address>
<Address>
<Street>Street3</Street>
<No>3</No>
<Code>3</Code>
<Country>AT</Country>
</Address>
</Items>
</Document>
下一个文档应标记为无效,因为文档中存在 Country
枚举中的多个值(CH 和 DE):
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:enumtest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:enumtest enumtest.xsd">
<Items>
<Address>
<Street>Street1</Street>
<No>1</No>
<Code>1</Code>
<Country>CH</Country>
</Address>
<Address>
<Street>Street2</Street>
<No>2</No>
<Code>2</Code>
<Country>CH</Country>
</Address>
<Address>
<Street>Street3</Street>
<No>3</No>
<Code>3</Code>
<Country>DE</Country>
</Address>
</Items>
</Document>
我已经尝试使用 <unique>
约束进行试验,不幸的是没有取得太大成功。有没有办法为每个文档定义这样一个独占枚举?
显然可以在 XSD 1.1 中使用断言来完成,但我不认为它可以在 XSD 1.0 中完成。
XSD 1.0
您不能将所有 Country
元素限制为同时具有多个值中的相同值。 备选方案:
- 您的 XSD 可以强制文档中的所有
Country
元素成为
通过 fixed
属性同时确定的预选值。
- 您的 XML 可以(可以说应该)重新设计以考虑共同点
每个
Address
中的 Country
个值并存储在一个单独的,
文档中的常见位置,例如属性或子元素
Items
或 Document
.
XSD 1.1
一个xsd:assertion
可以表达你的约束:
<xs:assert test="count(distinct-values(en:Items/en:Address/en:Country)) = 1"/>
这是在您完整的上下文中 XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:en="urn:enumtest"
targetNamespace="urn:enumtest"
elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:simpleType name="Country">
<xs:restriction base="xs:string">
<xs:enumeration value="CH"/>
<xs:enumeration value="AT"/>
<xs:enumeration value="DE"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="Address">
<xs:sequence>
<xs:element name="Street" type="xs:string"/>
<xs:element name="No" type="xs:integer"/>
<xs:element name="Code" type="xs:integer"/>
<xs:element name="Country" type="en:Country"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Items">
<xs:sequence>
<xs:element name="Address" type="en:Address" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Document">
<xs:complexType>
<xs:sequence>
<xs:element name="Items" type="en:Items"/>
</xs:sequence>
<xs:assert test="count(distinct-values(en:Items/en:Address/en:Country)) = 1"/>
</xs:complexType>
</xs:element>
</xs:schema>
我想定义一个包含枚举的 xsd 模式。然而,枚举的值在整个文档中应该是唯一的。为了说明这一点,请考虑以下架构:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="urn:enumtest" targetNamespace="urn:enumtest" elementFormDefault="qualified">
<xs:simpleType name="Country">
<xs:restriction base="xs:string">
<xs:enumeration value="CH"/>
<xs:enumeration value="AT"/>
<xs:enumeration value="DE"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="Address">
<xs:sequence>
<xs:element name="Street" type="xs:string"/>
<xs:element name="No" type="xs:integer"/>
<xs:element name="Code" type="xs:integer"/>
<xs:element name="Country" type="Country"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Items">
<xs:sequence>
<xs:element name="Address" type="Address" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Document">
<xs:complexType>
<xs:sequence>
<xs:element name="Items" type="Items"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
以下两个文档应该通过验证,因为它们每个都包含文档中 Country
枚举的唯一值(第一个文档中的 CH,第二个文档中的 AT):
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:enumtest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:enumtest enumtest.xsd">
<Items>
<Address>
<Street>Street1</Street>
<No>1</No>
<Code>1</Code>
<Country>CH</Country>
</Address>
<Address>
<Street>Street2</Street>
<No>2</No>
<Code>2</Code>
<Country>CH</Country>
</Address>
<Address>
<Street>Street3</Street>
<No>3</No>
<Code>3</Code>
<Country>CH</Country>
</Address>
</Items>
</Document>
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:enumtest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:enumtest enumtest.xsd">
<Items>
<Address>
<Street>Street1</Street>
<No>1</No>
<Code>1</Code>
<Country>AT</Country>
</Address>
<Address>
<Street>Street2</Street>
<No>2</No>
<Code>2</Code>
<Country>AT</Country>
</Address>
<Address>
<Street>Street3</Street>
<No>3</No>
<Code>3</Code>
<Country>AT</Country>
</Address>
</Items>
</Document>
下一个文档应标记为无效,因为文档中存在 Country
枚举中的多个值(CH 和 DE):
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:enumtest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:enumtest enumtest.xsd">
<Items>
<Address>
<Street>Street1</Street>
<No>1</No>
<Code>1</Code>
<Country>CH</Country>
</Address>
<Address>
<Street>Street2</Street>
<No>2</No>
<Code>2</Code>
<Country>CH</Country>
</Address>
<Address>
<Street>Street3</Street>
<No>3</No>
<Code>3</Code>
<Country>DE</Country>
</Address>
</Items>
</Document>
我已经尝试使用 <unique>
约束进行试验,不幸的是没有取得太大成功。有没有办法为每个文档定义这样一个独占枚举?
显然可以在 XSD 1.1 中使用断言来完成,但我不认为它可以在 XSD 1.0 中完成。
XSD 1.0
您不能将所有 Country
元素限制为同时具有多个值中的相同值。 备选方案:
- 您的 XSD 可以强制文档中的所有
Country
元素成为 通过fixed
属性同时确定的预选值。 - 您的 XML 可以(可以说应该)重新设计以考虑共同点
每个
Address
中的Country
个值并存储在一个单独的, 文档中的常见位置,例如属性或子元素Items
或Document
.
XSD 1.1
一个xsd:assertion
可以表达你的约束:
<xs:assert test="count(distinct-values(en:Items/en:Address/en:Country)) = 1"/>
这是在您完整的上下文中 XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:en="urn:enumtest"
targetNamespace="urn:enumtest"
elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:simpleType name="Country">
<xs:restriction base="xs:string">
<xs:enumeration value="CH"/>
<xs:enumeration value="AT"/>
<xs:enumeration value="DE"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="Address">
<xs:sequence>
<xs:element name="Street" type="xs:string"/>
<xs:element name="No" type="xs:integer"/>
<xs:element name="Code" type="xs:integer"/>
<xs:element name="Country" type="en:Country"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Items">
<xs:sequence>
<xs:element name="Address" type="en:Address" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Document">
<xs:complexType>
<xs:sequence>
<xs:element name="Items" type="en:Items"/>
</xs:sequence>
<xs:assert test="count(distinct-values(en:Items/en:Address/en:Country)) = 1"/>
</xs:complexType>
</xs:element>
</xs:schema>