1

我需要定义一个具有多种模式的元素,例如gDay, gMonth, gYear,dateTime等。如何在XSD中定义一个限制来做到这一点?

像这样:

<dates>
    <out>2012</out>
</dates>


<xs:complexType name="infodates">
        <xs:sequence>
            <xs:element name="out" type="xs:dateTime"&"xs:gMonth"/>
        </xs:sequence>
</xs:complexType>

谢谢

4

2 回答 2

1

这可以通过将自定义模式作为 TYPE.. 来完成,例如:

     <xs:simpleType name="CRNDATETIME">
        <xs:restriction base="xs:string">
          <xs:pattern value="|(((01|02|03|04|05|06|07|08|09|10|11|12)/(01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)/[1-2][0-9][0-9][0-9][ ](00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23)[:][0-5][0-9][:][0-5][0-9])|
                             ((01|02|03|04|05|06|07|08|09|10|11|12)/(01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)/[1-2][0-9][0-9][0-9][ ](01|02|03|04|05|06|07|08|09|10|11|12)[:][0-5][0-9][:][0-5][0-9] [aApP][mM]))"/>
        </xs:restriction>
      </xs:simpleType>

这接受以下模式的日期时间值
1. MM/DD/YYYY hh:mm:ss aAmM/pPmM ..
2. MM/DD/YYYY HH:mm:ss
也接受空值..

我知道这会有点困难,而不是非常困难..但可以实现..

于 2012-11-26T05:57:09.017 回答
1

简短的回答:xml 模式不能连接简单的数据类型。

无论如何,它可能不是您想要的:xs:gMonth需要一个双连字符前缀(例如“--05”),并且xs:gDay需要一个三连字符(例如“---31”)。不是我所期望的!以下是每个简单数据类型的示例。还有一些内置的组合类型:gYearMonthgMonthDay

沿着这些思路,xs:dateTime有一个很长的定义:'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)? 只能省略三个部分,因此需要yyyy-mm-ddThh:mm:ss-您的示例<out>2012</out>对此无效。


长答案:但是,xml 模式可以union通过(如选择)和list(相同类型的空格分隔列表)组合简单的数据类型。因此,您可以执行以下操作(gDay|gMonth|gYear|dateTime)*:(不是有效的 xsd 语法,只是说明性的)。这不是有序的并且允许重复,因此例如“---31 --05 --05”是有效的。这是 xsd 语法:

$ cat catDatatypes.xsd 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="eg" type="myString_Type"/>
  <xs:simpleType name="myString_Type">
    <xs:list>
      <xs:simpleType>
        <xs:union>
          <xs:simpleType>
            <xs:restriction base="xs:gDay"/>
          </xs:simpleType>
          <xs:simpleType>
            <xs:restriction base="xs:gMonth"/>
          </xs:simpleType>
          <xs:simpleType>
            <xs:restriction base="xs:gYear"/>
          </xs:simpleType>
          <xs:simpleType>
            <xs:restriction base="xs:dateTime"/>
          </xs:simpleType>
        </xs:union>
      </xs:simpleType>
    </xs:list>
  </xs:simpleType>
</xs:schema>

$ xmllint --schema catDatatypes.xsd catDatatypes.xml 
<eg>2012 --12 ---01 --12 ---31 --05 --05</eg>
catDatatypes.xml validates

结论:您不能以您(和我)想要的方式重用内置数据类型,而且它们看起来也不是很好。您最好自己明确定义它,就像 InfantProgrammer'Aravind 的回答一样。(或者,您可以为每个组件使用单独的属性 - 这也将使解析它的人更容易)。


为了好玩,我尝试缩短 InfantProgrammer'Aravind 的答案(尽管这是否使它更清晰是有争议的......)。它保留了上午/下午的 12 小时与没有上午/下午的 24 小时的检查(但不接受空的又名空值)。

 <xs:simpleType name="CRNDATETIME2">
    <xs:restriction base="xs:string">
      <xs:pattern value="(0[1-9]|1[012])/(0[1-9]|[12]\d|3[01])/([12]\d{3}) ((0\d|1[012])(:[0-5]\d){2}|(0\d|1[012])(:[0-5]\d){2} [aApP][mM])"/>
    </xs:restriction>
  </xs:simpleType>

这是XSD 中正则表达式的简要指南;这是一个的。

顺便说一句:原来你可以将“[1-9]”表示为“[\d-[0]]”,这是一个“字符类减法,而不是一个范围。

于 2012-11-26T12:23:06.413 回答