【发布时间】:2012-03-27 12:05:22
【问题描述】:
我希望我的 XSD 验证字符串的内容。具体来说,我想验证某个字符串不会出现。
考虑这条规则,它将验证我的字符串是否出现。查找所有 Linkelements 以这个特定的字符串开头:/site/example.com
<xs:element name="Link" type="xs:normalizedString" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:pattern value="(/site/example\.com).*"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
换句话说,上面的表达式验证所有Link 元素都以/site/example.com 开头。您如何反转上面的表达式,以便**验证没有Link 元素以/site/example.com 开头?
我尝试了以下正则表达式,但没有成功:/[^(site/example\.com)].*,所以这不起作用:
无效的策略1(单个字符的否定) 我知道这可能适用于否定单个字符,因为这个 SO 问题就是这样做的:XML schema restriction pattern for not allowing empty strings
该问题中的建议模式<xs:pattern value=".*[^\s].*" />
但在这种情况下,仅否定单个字符是行不通的,因为它会正确地失败:
/site/example.com
但它也会错误地失败
/解决方案
不起作用的策略 2(高级正则表达式前瞻)
根据这个 SO 问题 (Regular expression to match a line that doesn't contain a word?),您可以通过否定前瞻 (?!expr) 来解决这个问题。
所以这将在普通的正则表达式中工作:
^((?!/site/example.com).)*$
现在,不幸的是 xsd 验证仅支持有限的正则表达式。根据这个网站,不支持前瞻:regular-expressions.info -- xsd
这几乎描述了我到目前为止所尝试的内容。
我的问题是,我如何否定 XSD 模式中的正则表达式?
【问题讨论】:
标签: xsd xsd-validation