如何为xs提供多个值:simpleType?

时间:2017-08-01 08:07:00

标签: xml xslt xsd xsd-validation

所以我目前正在开发一个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,我仍然对所有这些标签和元素以及如何连接它们感到困惑正确。

2 个答案:

答案 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>