7

我正在尝试在 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匹配数字的地方吗?或者其他特殊模式代码是什么?

4

2 回答 2

12

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

于 2010-11-19T19:54:07.723 回答
3

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

<xs:simpleType name="DateFormat">
    <xs:restriction base="xs:string">
        <xs:pattern value="|[0-9]{8}" />
    </xs:restriction>
</xs:simpleType>
于 2012-07-18T01:56:49.850 回答