2

我想编写一个 XSD 来限制 xsd:token 类型的有效 XML 元素的内容,以便在验证时它们与包装在 xsd:string 中的相同内容无法区分。

即它们不包含回车符 (#xD)、换行符 (#xA) 或制表符 (#x9),以空格 (#x20) 字符开头或结尾,并且不包含两个或多个相邻字符的序列空格字符。

我认为要使用的正则表达式是这样的:

\S+( \S+)*

(一些非空格,可选[一个或多个非空格旁边的单个空格],包括始终关闭的非空格)

这适用于各种正则表达式测试工具,但我似乎无法使用 oXygen XML 编辑器进行检查;字符串中的双空格、前导和尾随空格、制表符和换行符似乎允许 XML 实例仍然通过验证。

这是 XSD 的实现:

<xs:simpleType name="Tokenized500Type">
    <xs:restriction base="xs:token">
      <xs:maxLength value="500"/>
      <xs:minLength value="1"/>
      <xs:pattern value="\S+( \S+)*"/>
    </xs:restriction>
  </xs:simpleType>

有没有什么特点

  • XML

或者

  • XSD

或者

  • oXygen XML 编辑器

这阻止了这个工作?

4

2 回答 2

2

基本类型必须是 xsd:string。

使用 xsd:Token 对输入进行标记,然后检查它是否是标记。那是多余的。

于 2016-11-01T13:16:08.630 回答
1

您的原始([^\s])+( [^\s]+)*([^\s])*正则表达式包含一些冗余模式:它匹配并捕获 1+ 个非空格的每次迭代,然后匹配 0+ 个空格序列和 1+ 个非空格,然后再次尝试匹配和捕获非空格的每次迭代.

您可以使用类似但更短的

\S+( \S+)*

由于 XML Schema 正则表达式是默认锚定的,因此表达式匹配:

  • \S+- 除空格外的一个或多个字符,特别是&#20;(空格)、\t(制表符)、\n (换行符)和\r(返回)
  • ( \S+)*- 零个或多个空格序列和 1+ 个空格。

此表达式不允许重复的连续空格,并且在前导/尾随位置没有空格。

以下是应该如何使用正则表达式:

<xs:simpleType name="Tokenized500Type">
  <xs:restriction base="xs:string">
    <xs:pattern value="\S+( \S+)*"/>
    <xs:maxLength value="500"/>
    <xs:minLength value="1"/>
  </xs:restriction>
</xs:simpleType>
于 2016-11-01T09:04:43.457 回答