无法将模式添加到xsd中的anyURI字段

时间:2019-01-27 18:30:11

标签: regex xml xsd xsd-validation

我正在尝试将一种模式添加到anyURI中,以消除前导/后缀和中间的空格,因为复制粘贴错误造成了很多问题。

到目前为止,我能够提出这个建议

<element name="randomUri">
   <simpleType>
     <restriction base="anyURI"><pattern value="\S(.*\S)?"/></restriction>
   </simpleType>
</element> 

但是当我尝试针对xml对其进行验证时,看起来好像与模式不匹配,我可以在它们之间加前导/后缀和空格。如果我对字符串使用了该模式,即在限制条件下使base="string"时,该模式将非常有效。是否有anyURI的某些独特属性不允许我执行此操作?

P.S:我没有采用pattern value = "http://.*的方式,因为我想适应sample.app://sampleapp.之类的自定义方案,例如

只是为了使事情变得清楚...我想消除网址的前导/结尾和空格。如果上面的模式randomUristring,那么我上面使用的模式就可以很好地工作,但是当我将randomUri设为anyURI时,它就无法工作。

2 个答案:

答案 0 :(得分:1)

xs:anyURI类型的whiteSpace面为collapse,这意味着在针对pattern面进行测试之前,先从值中去除了前导和尾随空格。这基本上意味着,始终允许使用前导和尾随空格(并认为它们是可忽略的),并且无法使用pattern构面来阻止。

答案 1 :(得分:0)

我用您提供的(小)样本测试了您的代码,其中的问题之一似乎是您没有在xs:element上指定数量。因此它在xs:pattern上没有失败,它在第一个xs:pattern 上没有失败。因此,您应该在xs:element上指定一个量词:

<element name="randomUri" maxOccurs="unbounded">
...

另一个简单的建议可能是通过使用\S*而不是\S在URI之前和之后指定零个或多个SPACE字符。也许这会改善匹配度。