如何为 xs:simpleType 提供多个值?
How to provide multiple values for a xs:simpleType?
所以我目前正在处理一个 XSD 文件,其中包含一个名为 ipaddress
:
的简单类型
<xs:simpleType name="ipaddress">
<xs:restriction base ="xs:string">
<xs:pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]).){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"/>
</xs:restriction>
</xs:simpleType>
这个适用于我使用的所有 IP 地址。
但我希望 ipaddress 接受 ipaddress 本身或字符串 "localhost"。我怎么做?我已经尝试过这样的事情
<xs:simpleType name="ipaddress">
<xs:restriction base ="xs:string">
<xs:choice minOccurs="1" maxOccurs="1">
<xs:pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]).){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"/>
<xs:enumeration value="localhost"/>
<xs:choice>
</xs:restriction>
</xs:simpleType>
或者那样
<xs:complexType name="ipaddress">
<xs:choice minOccurs="1" maxOccurs="1">
<xs:pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]).){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])" type="xs:string"/>
<xs:enumeration value="localhost" type="xs:string"/>
<xs:choice>
</xs:complexType>
但是在根据 xsd 模式验证我的 xml 文件时,这些解决方案中的 none 有效。我认为我不知道如何使用 xs:choice
是正确的 - 我正处于学习 XSD 的最开始阶段,我仍然对所有这些标签和元素感到困惑,并且如何正确连接。
我认为选择是针对复杂类型的,对于简单的类型限制,您可以简单地添加另一个模式
<xs:simpleType name="ipaddress">
<xs:restriction base ="xs:string">
<xs:pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]).){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"/>
<xs:pattern value="localhost"/>
</xs:restriction>
</xs:simpleType>
根据 W3C page on xs:restriction
,您可以在一个 xs:restriction
中使用多个 xs:pattern
:
Note: An XML containing more than one element gives rise to a single ·regular expression· in the set; this ·regular expression· is an "or" of the ·regular expressions· that are the content of the elements.
因此以下内容有效:
<xs:simpleType name="ipaddress">
<xs:restriction base ="xs:string">
<xs:pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]).){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"/>
<xs:pattern value="localhost"/>
</xs:restriction>
</xs:simpleType>
所以我目前正在处理一个 XSD 文件,其中包含一个名为 ipaddress
:
<xs:simpleType name="ipaddress">
<xs:restriction base ="xs:string">
<xs:pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]).){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"/>
</xs:restriction>
</xs:simpleType>
这个适用于我使用的所有 IP 地址。 但我希望 ipaddress 接受 ipaddress 本身或字符串 "localhost"。我怎么做?我已经尝试过这样的事情
<xs:simpleType name="ipaddress">
<xs:restriction base ="xs:string">
<xs:choice minOccurs="1" maxOccurs="1">
<xs:pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]).){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"/>
<xs:enumeration value="localhost"/>
<xs:choice>
</xs:restriction>
</xs:simpleType>
或者那样
<xs:complexType name="ipaddress">
<xs:choice minOccurs="1" maxOccurs="1">
<xs:pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]).){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])" type="xs:string"/>
<xs:enumeration value="localhost" type="xs:string"/>
<xs:choice>
</xs:complexType>
但是在根据 xsd 模式验证我的 xml 文件时,这些解决方案中的 none 有效。我认为我不知道如何使用 xs:choice
是正确的 - 我正处于学习 XSD 的最开始阶段,我仍然对所有这些标签和元素感到困惑,并且如何正确连接。
我认为选择是针对复杂类型的,对于简单的类型限制,您可以简单地添加另一个模式
<xs:simpleType name="ipaddress">
<xs:restriction base ="xs:string">
<xs:pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]).){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"/>
<xs:pattern value="localhost"/>
</xs:restriction>
</xs:simpleType>
根据 W3C page on xs:restriction
,您可以在一个 xs:restriction
中使用多个 xs:pattern
:
Note: An XML containing more than one element gives rise to a single ·regular expression· in the set; this ·regular expression· is an "or" of the ·regular expressions· that are the content of the elements.
因此以下内容有效:
<xs:simpleType name="ipaddress">
<xs:restriction base ="xs:string">
<xs:pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]).){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"/>
<xs:pattern value="localhost"/>
</xs:restriction>
</xs:simpleType>