1

、、、、などgDayの複数のパターンで要素を定義する必要があります。これを行うためにXSDで制限を定義するにはどうすればよいですか?gMonthgYeardateTime

このような何か:

<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

簡単な答え: xml スキーマは単純なデータ型を連結できません。

とにかく、それはあなたが望むものではないかもしれませんxs:gMonth.2つのハイフンプレフィックスが必要です (例: "--05"), xs:gDay3つのハイフンが必要です (例: "---31"). 私が期待したものではありません!単純な各データ型の例を次に示します。いくつかの組み合わせ型も組み込まれています:gYearMonthなどgMonthDay

これらの行に沿っxs:dateTimeて、長い定義があります。'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)? 除外できるのは3つの部分だけなので、必要ですyyyy-mm-ddThh:mm:ss-これに関しては、の例<out>2012</out>は有効ではありません。


長い答え: ただし、xml スキーマでは、単純なデータ型を(選択のように) と(同じ型のスペースで区切られたリスト) で組み合わせることができます。したがって、次のようなことができます: (有効な xsd 構文ではありません。単なる例示です)。これは順序付けられておらず、重複が許可されているため、たとえば「---31 --05 --05」が有効です。ここに xsd 構文があります。unionlist(gDay|gMonth|gYear|dateTime)*

$ 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 時間のチェックを保持します (ただし、空の別名 null 値は受け入れません)。

 <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 に答える
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
は null 値も受け入れます ..

私はそれが少し難しいことを知っています..しかし達成可能..

于 2012-11-26T05:57:09.017 に答える