所以我目前正在开发一个XSD文件,其中包含一个名为ipaddress
的simpleType:
<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文件时,这些解决方案都不起作用。我认为我是正确的使用xs:choice
我不知道如何 - 我刚开始学习XSD,我仍然对所有这些标签和元素以及如何连接它们感到困惑正确。
答案 0 :(得分:1)
我认为选择适用于复杂类型,对于简单的类型限制,您只需添加另一种模式
<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>
答案 1 :(得分:1)
根据W3C page on xs:restriction
,您可以在一个xs:pattern
中使用多个xs:restriction
:
注意:包含多个元素的XML会在集合中生成单个正则表达式。这个·正则表达式·是正则表达式的“或”,它们是元素的内容。
所以以下工作正常:
<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>