无法将模式添加到 xsd 中的任何 URI 字段

Unable to add pattern to anyURI field in xsd

我正在尝试向 anyURI 添加一个模式,这样我就可以消除 leading/trailing 和中间的空格,因为复制粘贴错误会产生很多问题。

到目前为止我能想到这个

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

但是当我尝试根据 xml 验证它时,它看起来好像与模式不匹配,我可以在它们之间给出 leading/trailing 和空格。如果我将它用于字符串,即当我在我的限制中制作 base="string" 时,这种模式非常有效。 anyURI 是否有一些独特的 属性 不允许我这样做?

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

只是为了让事情更清楚...我想消除 leading/trailing 和 url 之间的空格。如果 randomUristring,我上面使用的模式完全可以正常工作,但是当我将 randomUri 设为 anyURI 时,它就不起作用了。

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

上指定一个量词
<element name="randomUri" maxOccurs="unbounded">
...

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

xs:anyURI 类型具有 collapsewhiteSpace 方面,这意味着在针对 pattern 方面测试前导空格和尾随空格会从值中删除.这基本上意味着前导和尾随空格总是被允许的(并且被认为是可忽略的)并且不能使用 pattern 方面来阻止。