我正在尝试在 XSD 中定义一个方案规则,其中字符串长度为 8 个字符:

<PostedDate>42183296</PostedDate>

并且也允许空间填充:

<PostedDate>        </PostedDate>

这让我想到了 XSD:

<xs:simpleType name="DateFormat">
   <xs:restriction base="xs:string">
      <xs:length value="8" />            //exactly 8 characters long
</xs:simpleType>

但价值 也可以是空的(即零字符长):

<PostedDate></PostedDate>
<PostedDate />

这导致我天真地尝试:

<xs:simpleType name="DateFormat">
   <xs:restriction base="xs:string">
      <xs:length value="8" />            //exactly 8 characters long
      <xs:length value="0" />            //exactly 0 characters long
</xs:simpleType>

这当然是不允许的。

正如 XSD 中的常见情况,大多数格式无法轻松地用 XSD 表示,因此我选择尝试正则表达式规则:

.{8} | ""

尝试转换为 XSD 我输入:

<xs:simpleType name="DateFormat">
    <xs:restriction base="xs:string">
        <xs:pattern value=".{8}|''" />
    </xs:restriction>
</xs:simpleType>

但这没有用:

''20101111' is not facet-valid with respect to pattern '.{8}|''' for type 'DateFormat'

我也尝试过

  • <xs:pattern value="[0-9]{8}|''" />
  • <xs:pattern value="([0-9]{8})|('')" />
  • <xs:pattern value="(\d{8})|('')" />

其他任何人都可以解决匹配问题的模式吗 - 一些特定的模式 -空

奖金: 谁能指出这个地方 XSD 文档 就是说 \d 匹配数字?或者还有哪些特殊的图案代码?

有帮助吗?

解决方案

我可能猜想模式应该看起来像 \d{8}| 这意味着“八位数字或什么都没有”,但不是八位数字或两个引号。但这并不能解释为什么 20101111 不匹配。您确定元素值中没有空格或其他附加符号吗?
\d 据说匹配“F.1.1 字符类转义”部分中的数字

其他提示

我也在同样的情况下允许空字符串,否则它必须是 6 个长度的数字。最后我用了像下面这样的。这对我有用

<xs:simpleType name="DateFormat">
    <xs:restriction base="xs:string">
        <xs:pattern value="|[0-9]{8}" />
    </xs:restriction>
</xs:simpleType>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top