【问题标题】:XSD regular expression pattern: this or nothingXSD 正则表达式模式:此或无
【发布时间】:2011-05-12 18:17:40
【问题描述】:

我正在尝试在 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 的 i 类型:

<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'

我也试过了

  • &lt;xs:pattern value="[0-9]{8}|''" /&gt;
  • &lt;xs:pattern value="([0-9]{8})|('')" /&gt;
  • &lt;xs:pattern value="(\d{8})|('')" /&gt;

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

奖励:谁能指出the XSD documentation 中说\d 匹配数字的地方?或者其他特殊的模式代码是什么?

【问题讨论】:

  • 我认为\d{8}? 应该可以工作。 ? 表示前面的内容是可选的。

标签: regex xsd xsd-validation


【解决方案1】:

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

【讨论】:

  • 这是我永远不会想到的技巧\d{8}| 的意思是 “八位数字 | 没有”。偷偷摸摸。你是对的;我不知道为什么我的模式 .{8}|'' 以前与 20101111 不匹配 - 现在可以了。虽然在我使用网站验证 xml+xsd 之前。从午餐时间开始,我编写了一个 xml-studio 程序来提供更多交互式反馈。
  • 同样重要的是要注意xs:totalDigits 限制必须在xs:pattern 限制之后。否则解析器会在内部将文本 000001 转换为单个数字 1,然后无法针对模式 (\d){6} 进行验证,因为它不是 6 个字符长!
【解决方案2】:

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

<xs:simpleType name="DateFormat">
    <xs:restriction base="xs:string">
        <xs:pattern value="|[0-9]{8}" />
    </xs:restriction>
</xs:simpleType>

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多