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
开头,然后是换行符以外的任何字符和从 1
到 9
的数字
|
- 或
[1-1][0-2]
- 以 1
开头(注意 [1-1]
= 1
),然后是从 0
到 2
的数字。
您可以使用
<xs:pattern value="1\.(1[0-2]|[1-9])"/>
参见regex demo。请记住,XSD 模式正则表达式模式必须匹配整个字符串,这里是它匹配的内容:
1
- 匹配 1
\.
- 匹配文字点(.
不带转义符号匹配任何字符,但换行字符)
(1[0-2]|[1-9])
- 匹配 10
、11
、12
或匹配的捕获组(注意 XSD 模式正则表达式不支持非捕获组)从 1
到 9
范围内的数字。
试试括号:
<xs:pattern value="1\.([1-9]|1[0-2])"/>
注意转义的“.”,否则您将匹配 1$12 之类的内容。我认为 [1-1]
可能是允许的,但 1
似乎更简单。
我在 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
开头,然后是换行符以外的任何字符和从1
到9
的数字
|
- 或[1-1][0-2]
- 以1
开头(注意[1-1]
=1
),然后是从0
到2
的数字。
您可以使用
<xs:pattern value="1\.(1[0-2]|[1-9])"/>
参见regex demo。请记住,XSD 模式正则表达式模式必须匹配整个字符串,这里是它匹配的内容:
1
- 匹配1
\.
- 匹配文字点(.
不带转义符号匹配任何字符,但换行字符)(1[0-2]|[1-9])
- 匹配10
、11
、12
或匹配的捕获组(注意 XSD 模式正则表达式不支持非捕获组)从1
到9
范围内的数字。
试试括号:
<xs:pattern value="1\.([1-9]|1[0-2])"/>
注意转义的“.”,否则您将匹配 1$12 之类的内容。我认为 [1-1]
可能是允许的,但 1
似乎更简单。