XSD:从模式中限制0(零)

时间:2012-11-19 09:15:54

标签: xml regex xsd xsd-validation

示例xsd

<xsd:simpleType name="test">
        <xsd:restriction base="xsd:token">
            <xsd:pattern value="[a-zA-Z0-9\-]{1,17}"/>
        </xsd:restriction>
    </xsd:simpleType>

如何更改此模式以阻止零。 (有可能)
更多信息:
不应该允许0 不应允许00,000,000等 10有效且应该被允许

3 个答案:

答案 0 :(得分:1)

由于XML不支持前瞻,因此对于长度为17的字符串断言此正则表达式可能会非常难看。但我认为你可以将长度约束提取到一个单独的限制:

<xsd:simpleType name="test">
    <xsd:restriction base="xsd:token">
        <xsd:pattern value="[a-zA-Z0-9\-]*[a-zA-Z1-9\-][a-zA-Z0-9\-]*"/>
        <xsd:minLength value="1"/>
        <xsd:maxLength value="17"/>
    </xsd:restriction>
</xsd:simpleType>

现在模式需要一个非零字符(在允许的字符类之外)。

答案 1 :(得分:1)

如果您的目标不是禁止在令牌中出现0,而只是禁止仅包含零的令牌(因此接受'10'和'01'但是'0','00'等是拒绝),那么也许这会做你想要的:

<xs:simpleType name="test">
  <xs:restriction>
    <xs:simpleType>
      <xs:restriction base="xs:token">
        <xs:pattern value="[a-zA-Z0-9\-]{1,17}"/>
      </xs:restriction>
    </xs:simpleType>
    <xs:pattern value=".*[^0].*"/>
  </xs:restriction>
</xs:simpleType>

基本思想只是从你已经定义的类型开始,然后通过限制从中派生另一个类型,添加约束,即词法空间的每个成员必须有一个非0的字符。

答案 2 :(得分:0)

怎么样

<xsd:pattern value="[a-zA-Z1-9\-]|[a-zA-Z0-9\-]{2,17}"/>