【发布时间】:2017-09-08 14:21:37
【问题描述】:
我正在处理某种交换格式的 XSD 文件。标题说我们存在符合XML schema(2001 年的一个,所以是 1.0)的文档,并且这是文档的 0.4.0 版本。此外,注释表明该文档是由 Altova XMLSpy v2015 创建的:
<!-- W3C Schema generated by XMLSpy v2015 rel. 3 (x64)
(http://www.altova.com) Payment Instructions -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="0.4.0">
这个文件定义了一个类型来描述IBANs,这是一个xs:string被限制匹配某个正则表达式:
<xs:simpleType name="IBANType">
<xs:restriction base="xs:string">
<xs:pattern value="^$||([A-Z]{2,2}[0-9]{2,2}[A-Z0-9]{1,30})||(\.)"/>
</xs:restriction>
</xs:simpleType>
现在给出的正则表达式似乎不符合相当受限的standard XML Schema regex。特别是,它使用 (更正:重复模式可以在the W3C XSD primer 中找到。这使得正则表达式成为有效的XSD 正则表达式,尽管接受字符串^ 和$ 和重复模式{x,y}^$ 并且使用了太多|。) 实际上,如果|| 被| 替换,我们会得到Perl regex
-
^$== "空字符串" - 或
| -
([A-Z]{2,2}[0-9]{2,2}[A-Z0-9]{1,30})== 2 x alpha、2 x digit、1-30 x alpha 或数字 - 或
| -
(\.)== 一个点(分组括号是多余的)
这确实与 IBAN 格式匹配,并涵盖了两种特殊情况“缺失数据”和“缺失数据,由点替换”(只需将元素排除在外,这两种情况都会更优雅地处理,但这不在我的问题范围)。
人们预计 XSD 验证器的实现会抱怨这样的正则表达式,但没有。通过处理 XSD 文件,我从 javax.xml.validation.SchemaFactory 获得了有效的 javax.xml.validation.Validator:没问题,没有警告,而且验证器似乎正确地使用了该正则表达式来检查输入。
这怎么可能?这里遵循什么规范,为什么 Altova XMLSpy 会生成这样的表达式?实现是不是很宽容,说“这看起来像一个 Perl 正则表达式,所以我会这样处理,看我不在乎”?
【问题讨论】:
-
@version 属性表示“这是此架构的 0.4.0 版本”,而不是“此架构符合 XSD 规范的 0.4.0 版本”。
-
@Michael 谢谢你,更正文字。
标签: regex xml validation xsd