【问题标题】:How can I set up a custom pattern for an XSD date?如何为 XSD 日期设置自定义模式?
【发布时间】:2020-12-29 22:04:53
【问题描述】:

我正在尝试将以下模式放入 XSD 架构中: 2020 年 1 月 1 日

我尝试使用模式标签,但我什至无法验证最简单的 dd/mm/yyyy 格式。 有没有办法实现上面的模式,只有几个月可以在那里,而不仅仅是一个简单的字符串? 我还尝试将其作为字符串作为基础并对其设置模式限制,但我无法弄清楚如何实现它。

我正在使用 XML 1.0

我的 XSD:

  <xs:simpleType name="ReleaseYearDesc">
    <xs:restriction base="xs:gYear">
      <xs:minInclusive value="1900"/>
      <xs:maxInclusive value="2020"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="DateAddedDesc">
    <xs:restriction base="xs:date">
      <xs:pattern value=""/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="DatesDescription">
    <xs:sequence>
      <xs:element name="ReleaseYear" type="ReleaseYearDesc" minOccurs="1" maxOccurs="1"/>
      <xs:element name="DateAdded" type="DateAddedDesc" minOccurs="1" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>

我想要的结果:

  <Dates>
    <ReleaseYear>2020</ReleaseYear>
    <DateAdded>September 9, 2019</DateAdded>
  </Dates>

我在我的 XSD 文件中调用下面的元素,我认为没有必要包含该部分。

【问题讨论】:

  • (1) 您的 XSD 版本是什么:1.0 还是 1.1? (2) 请提供一个可重现的最小示例。
  • 查看编辑,不便之处敬请见谅。
  • 根据正确答案,我的最终模式如下: January(\s){1}([1-9]|1[0-9]|2[0-9]|3 [01]),(\s){1}((19[0-9][0-9])|20[01][0-9]|2020)

标签: xml date xsd format


【解决方案1】:

您不能使用内置的 XML Schema 简单类型来描述字符串的各个部分。一个简单的类型定义需要描述整个值。这里唯一的方法是使用模式构面创建 xs:string 的限制。

当我遇到这样的事情时,我的标准做法是:

  1. 了解问题
  2. 了解语言/工具
  3. 使用语言/工具找到问题的解决方案

在您的情况下,语言是 XML Schema,语言规范的相关部分在这里:https://www.w3.org/TR/xmlschema-2/#rf-pattern

架构表示约束:多种模式 如果多个元素信息项作为 a 的 [children] 出现,则应将 [value] 组合起来,就好像它们出现在单个·正则表达式·中一样,作为单独的·branch·es。 注意:这是模式表示约束多个模式(第 4.3.4.3 节)和·限制·规则的结果,即在类型派生的同一步骤中指定的·模式·方面是 ORed在一起,而在类型推导的不同步骤上指定的·pattern· facets 被 ANDed 在一起。

换句话说,您可以在一个简单的类型限制上指定多个模式方面,它们将被视为替代有效模式。

我认为这样的事情应该可行:

<xs:simpleType name="customDateFormat">
    <xs:restriction base="xs:string">
      <xs:pattern value="January +[0-9], +[0-9]{4}"/>
      <xs:pattern value="February +[0-9], +[0-9]{4}"/>
      <xs:pattern value="March +[0-9], +[0-9]{4}"/>
      <xs:pattern value="April +[0-9], +[0-9]{4}"/>
      <xs:pattern value="May +[0-9], +[0-9]{4}"/>
      <xs:pattern value="June +[0-9], +[0-9]{4}"/>
      <xs:pattern value="July +[0-9], +[0-9]{4}"/>
      <xs:pattern value="August +[0-9], +[0-9]{4}"/>
      <xs:pattern value="September +[0-9], +[0-9]{4}"/>
      <xs:pattern value="October +[0-9], +[0-9]{4}"/>
      <xs:pattern value="November +[0-9], +[0-9]{4}"/>
      <xs:pattern value="December +[0-9], +[0-9]{4}"/>
    </xs:restriction>
</xs:simpleType>

图案允许零件之间有多个空格,但您可以根据需要调整图案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多