XSD:正则表达式的属性

时间:2017-09-08 07:15:25

标签: regex xml xsd

我在XML中有一个包含正则表达式的属性:

<RegexPath regex="someRegex"/>

我想为它制作合适的XSD:

<xs:complexType name="RegexPath">
    <xs:attribute name="regex" type="xs:regex??" use="required"/>
</xs:complexType>

XSD中是否有正则表达式的数据类型定义?这不是生存重要的事情,但通过xsd验证器能够检测到无效的正则表达式会很不错......

2 个答案:

答案 0 :(得分:1)

也许令人惊讶的是,没有正则表达式可以准确匹配所有有效的正则表达式(没有别的)。这是因为正则表达式的语法是递归的,这意味着它不是常规语法(在计算机科学意义上的术语),这意味着它不能用正则表达式来描述。

你可以在XSD 1.1中使用断言(使用技巧)。这个技巧依赖于这样一个事实,即一个因XPath错误而失败的断言被视为断言是假的。所以断言

matches("", $value) or true()
如果$ value不是有效的正则表达式,则

失败,否则返回true。但是,您可能需要做一些进一步的技巧,以避免智能XPath优化器破坏这一点。将其写成

可能是安全的
if (matches("", $value)) 
then string-length($value) gt 0 
else string-length($value) ne 0

一个小警告:这是针对XPath正则表达式方言测试的,这与XSD正则表达式方言略有不同。

答案 1 :(得分:0)

W3C没有定义原始或内置的“regex”数据类型。 可能的是在简单类型定义的模式面上使用正则表达式。 这意味着您理论上可以创建自己的数据类型来验证正则表达式,但它可能是一个非常复杂的实现。