XML 使用带有“|”的 XSD(正则表达式)进行验证运算符(Notepad++ 插件)

XML validation using XSD (regex) with "|" operator (Notepad++ plugin)

我正在使用以下不是很严格的 XSD 验证(正则表达式)来检查字符串是否包含 https 或相对 URL 而不是 http.

<xs:attribute name="src">
    <xs:simpleType>
      <xs:restriction base="xs:string">
         <xs:pattern value="(.{4}[^:].*)|(.{1,4})"/>
      </xs:restriction>
    </xs:simpleType>
</xs:attribute>

样本XML:

Succeeds (suppose to fail)    <?xml version="1.0" encoding="UTF-8"?><html src="http://www.whosebug.com" /> 
Succeeds (as expected)        <?xml version="1.0" encoding="UTF-8"?><html src="https://www.whosebug.com" />
Succeeds (as expected)        <?xml version="1.0" encoding="UTF-8"?><html src="relative/url.html" />

当我使用在线验证器验证时,这是按预期工作的:

当我用 Notepad++ XML 插件验证时,这是失败的。该表达式虽然可以单独使用 "(.{4}[^:].*)" 和 "(.{1,4})",但不能与 "|" 运算符(或)一起使用。

XSD 验证在带有 OR 运算符的 Notepad++ 上的工作方式是否不同?是否有修复或我在这里遗漏了什么?

这看起来是 XMLLint (Linux) 的一个问题,我的一位同事也证实了这一点。

我认为仅使用 . 没有意义,因为我们正在检查确切的字符序列。要要求所有链接以 https 而不是 http 开头,您可以使用:

<xs:pattern value="https.*"/>

甚至

<xs:pattern value="https://.*"/>

编辑:

对于像 relative/url.html 这样的相对 URL,您可以添加 (?:[^/]*/)*[^/]+\.[^.]+ 子模式:

<xs:pattern value="https://.*|(?:[^/]*/)*[^/]+\.[^.]+"/>