【问题标题】:XSD : Restrict 0(Zero) from patternXSD:从模式中限制 0(零)
【发布时间】:2012-11-07 04:33:55
【问题描述】:

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,0000 等不应被允许
10个有效,应该被允许

【问题讨论】:

  • 前导零怎么样? 010, 0xff, 0abc?它们有效吗?

标签: xml regex xsd xsd-validation


【解决方案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>

现在该模式需要一个非零字符(超出允许的字符类别)。

【讨论】:

  • 我在想一些模式,比如第一个字符可以是 a-zA-z1-9,其余的都可以是 a-zA-Z0-9
  • 你能帮我在语法上使用这个
  • @JAB 那么我在评论中给出的三个例子都不是有效的
【解决方案2】:

如果您的目标不是禁止令牌中出现 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以外的字符的约束。

【讨论】:

    【解决方案3】:

    怎么样

    &lt;xsd:pattern value="[a-zA-Z1-9\-]|[a-zA-Z0-9\-]{2,17}"/&gt;

    【讨论】:

    • 这仍然允许00、000、0000等等。
    猜你喜欢
    • 2015-02-09
    • 2019-06-15
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多