xml 模式检查因模式匹配而失败

xml schema check fail with pattern match

我在 xsd 架构中有这样的样板代码。

      <xs:attribute name="version" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="1.1"/>
            <xs:enumeration value="1.2"/>
            <xs:enumeration value="1.3"/>
            <xs:enumeration value="1.4"/>
            <xs:enumeration value="1.5"/>
            <xs:enumeration value="1.6"/>
            <xs:enumeration value="1.7"/>
            <xs:enumeration value="1.8"/>
            <xs:enumeration value="1.9"/>
            <xs:enumeration value="1.10"/>
            <xs:enumeration value="1.11"/>
            <xs:enumeration value="1.12"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>

我只想用下面的模式替换。

<xs:pattern value="1.[1-9]|[1-1][0-2]"/>

它通过了 1.2 或 1.6,但以“1.10”失败。 with lxml.etree.DocumentInvalid: 元素 'sfd', 属性 'version': [facet 'pattern'] 模式 '1.[1-9]|[ 不接受值 '1.10' 1-1][0-2]'

我以为[1-9]|[1-1][0-2]代表1-9到10-12之间的范围

有什么问题?

您的正则表达式(参见 its demo)匹配一个字符串

  • 1.[1-9] - 以 1 开头,然后是换行符以外的任何字符和从 19
  • 的数字
  • | - 或
  • [1-1][0-2] - 以 1 开头(注意 [1-1] = 1),然后是从 02 的数字。

您可以使用

<xs:pattern value="1\.(1[0-2]|[1-9])"/>

参见regex demo。请记住,XSD 模式正则表达式模式必须匹配整个字符串,这里是它匹配的内容:

  • 1 - 匹配 1
  • \. - 匹配文字点(. 不带转义符号匹配任何字符,但换行字符)
  • (1[0-2]|[1-9]) - 匹配 101112 或匹配的捕获组(注意 XSD 模式正则表达式不支持非捕获组)从 19 范围内的数字。

试试括号:

<xs:pattern value="1\.([1-9]|1[0-2])"/>

注意转义的“.”,否则您将匹配 1$12 之类的内容。我认为 [1-1] 可能是允许的,但 1 似乎更简单。