我在XML中有一个包含正则表达式的属性:
<RegexPath regex="someRegex"/>
我想为它制作合适的XSD:
<xs:complexType name="RegexPath">
<xs:attribute name="regex" type="xs:regex??" use="required"/>
</xs:complexType>
XSD中是否有正则表达式的数据类型定义?这不是生存重要的事情,但通过xsd验证器能够检测到无效的正则表达式会很不错......
答案 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”数据类型。 可能的是在简单类型定义的模式面上使用正则表达式。 这意味着您理论上可以创建自己的数据类型来验证正则表达式,但它可能是一个非常复杂的实现。