XSD可选条件

时间:2013-06-12 14:52:55

标签: xsd conditional optional

很抱歉,如果这很简单或已在某处得到解答 - 我找不到任何有用的搜索条件。

我有一些日期输入,我想在条件级联中进行,如下所示:

  1. 整个日期采用ISO格式订单 - YYYY-MM-DD
  2. 月份和日期可能包含“非法”值,尤其是零或2月30日
  3. 密钥(以及此帖的原因),如果存在月份,则必须存在年份;如果存在日,则必须存在月份和年份。如此有效,日期可能是'YYYY'或'YYYY-MM'或'YYYY-MM-DD'。到目前为止,我只是一个简单的规范,检查各个元素,但不是我所描述的联合计划。这可以用XSD吗?

    <xs:element name='DatumOd' minOccurs='0' maxOccurs='1'>
      <xs:simpleType>
        <xs:restriction base='xs:string'>
          <xs:minLength value='4'/>
          <xs:maxLength value='10'/>
        </xs:restriction>
      </xs:simpleType>
    </xs:element>
    <xs:element name='RokStary' minOccurs='0' maxOccurs='1'>
      <xs:simpleType>
        <xs:restriction base='xs:short'>
          <xs:minInclusive value='700' />
          <xs:maxInclusive value='2013' />
        </xs:restriction>
      </xs:simpleType>
    </xs:element>
    <xs:element name='MesicStary' minOccurs='0' maxOccurs='1'>
      <xs:simpleType>
        <xs:restriction base='xs:byte'>
          <xs:minInclusive value='0' />
          <xs:maxInclusive value='12' />
        </xs:restriction>
      </xs:simpleType>
    </xs:element>
    <xs:element name='DenStary' minOccurs='0' maxOccurs='1'>
      <xs:simpleType>
        <xs:restriction base='xs:byte'>
          <xs:minInclusive value='0' />
          <xs:maxInclusive value='31' />
        </xs:restriction>
      </xs:simpleType>
    </xs:element>
    
  4. ==&GT;婴儿

    这将是一种方法,但它需要一个元素中的所有日期信息。此外,它在我的日期编号中允许更多的无意义值,例如2999年,13,14 ......,最多39天。

    如果再看一下我的尝试,你会看到我要么一次拥有所有数据信息,要么是元素:[DatumOd],或者是三个单独的元素:[RokStary],[MesicStary]和[DenStary] ]。我想要做的是指定我可以接受[DatumOd],或者[RokStary],[MesicStary]和[DenStary]。另外,我想级联依赖,因此[MesicStary]的存在要求[RokStary]存在,而[DenStary]要求[MesicStary]存在。所以,我可以:

    [DatumOd]

    OR

    [RokStary]

    OR

    [RokStary]和[MesicStary]

    OR

    [RokStary]和[MesicStary]和[DenStary]。

    这是否更清楚?

    =============================================== =========

    示例数据

        <?xml version='1.0' encoding='UTF-8'?>
        <dataroot>
          <DSXML SeqNum='1' ID='92491'>
            <TypZaznamu>Z</TypZaznamu>
            <Rad>RO</Rad>
            <Druh>Spermophilus citellus</Druh>
            <CharVyskyt>0</CharVyskyt>
            <DatumOd>1894</DatumOd>
            <Katastr>Habartice</Katastr>
            <Kvadrat>4956</Kvadrat>
            <Oblast>Frydlantska pahorkatina</Oblast>
            <Zdroj>(Wurm 1894, Wiesbaur 1894)</Zdroj>
            <Pocet>0</Pocet>
            <Elevation>240</Elevation>
            <Zapsano>06/24/98</Zapsano>
            <Zapsal>M.A.</Zapsal>
            <Poznamka>(Ebersdorf)</Poznamka>
            <Okres>LI</Okres>
            <Region>SC</Region>
          </DSXML>
          <DSXML SeqNum='2' ID='92591'>
            <TypZaznamu>Z</TypZaznamu>
            <Rad>RO</Rad>
            <Druh>Spermophilus citellus</Druh>
            <CharVyskyt>0</CharVyskyt>
            <DatumOd>1894-09</DatumOd>
            <Katastr>Habartice</Katastr>
            <Kvadrat>4956</Kvadrat>
            <Oblast>Frydlantska pahorkatina</Oblast>
            <Zdroj>(Wurm 1894, Wiesbaur 1894)</Zdroj>
            <Pocet>0</Pocet>
            <Elevation>240</Elevation>
            <Zapsano>06/24/98</Zapsano>
            <Zapsal>M.A.</Zapsal>
            <Poznamka>(Ebersdorf)</Poznamka>
            <Okres>LI</Okres>
            <Region>SC</Region>
          </DSXML>
          <DSXML SeqNum='3' ID='93491'>
            <TypZaznamu>Z</TypZaznamu>
            <Rad>RO</Rad>
            <Druh>Spermophilus citellus</Druh>
            <CharVyskyt>0</CharVyskyt>
            <DatumOd>1894-03-22</DatumOd>
            <Katastr>Habartice</Katastr>
            <Kvadrat>4956</Kvadrat>
            <Oblast>Frydlantska pahorkatina</Oblast>
            <Zdroj>(Wurm 1894, Wiesbaur 1894)</Zdroj>
            <Pocet>0</Pocet>
            <Elevation>240</Elevation>
            <Zapsano>06/24/98</Zapsano>
            <Zapsal>M.A.</Zapsal>
            <Poznamka>(Ebersdorf)</Poznamka>
            <Okres>LI</Okres>
            <Region>SC</Region>
          </DSXML>
          <DSXML SeqNum='4' ID='9418'>
            <TypZaznamu>Z</TypZaznamu>
            <Rad>CA</Rad>
            <Druh>Neovison vison</Druh>
            <CharVyskyt>2</CharVyskyt>
            <RokStary>1991</RokStary>
            <MesicStary>01</MesicStary>
            <DenStary>19</DenStary>
            <Katastr>Cernousy</Katastr>
            <Kvadrat>4956</Kvadrat>
            <Oblast>Frydlantska pahorkatina</Oblast>
            <Zdroj>(Andera &amp; Hanzal 1996)</Zdroj>
            <Pocet>0</Pocet>
            <Elevation>260</Elevation>
            <Zapsano>03/10/99</Zapsano>
            <Zapsal>M.A.</Zapsal>
            <Okres>LI</Okres>
            <Region>SC</Region>
          </DSXML>
          <DSXML SeqNum='5' ID='94174'>
            <TypZaznamu>Z</TypZaznamu>
            <Rad>CA</Rad>
            <Druh>Neovison vison</Druh>
            <CharVyskyt>2</CharVyskyt>
            <RokStary>1991</RokStary>
            <Katastr>Habartice</Katastr>
            <Kvadrat>4956</Kvadrat>
            <Oblast>Frydlantska pahorkatina</Oblast>
            <Zdroj>(Andera &amp; Hanzal 1996)</Zdroj>
            <Pocet>0</Pocet>
            <Elevation>240</Elevation>
            <Zapsano>03/10/99</Zapsano>
            <Zapsal>M.A.</Zapsal>
            <Okres>LI</Okres>
            <Region>SÈ</Region>
          </DSXML>
          <DSXML SeqNum='6' ID='94660'>
            <TypZaznamu>Z</TypZaznamu>
            <Rad>RO</Rad>
            <Druh>Apodemus agrarius</Druh>
            <CharVyskyt>4</CharVyskyt>
            <RokStary>1991</RokStary>
            <MesicStary>05</MesicStary>
            <Katastr>Cernousy</Katastr>
            <Kvadrat>4956</Kvadrat>
            <Oblast>Frydlantska pahorkatina</Oblast>
            <Zdroj>(Barta Z. &amp; Benda 1998)</Zdroj>
            <Pocet>9</Pocet>
            <Elevation>260</Elevation>
            <Zapsano>05/06/99</Zapsano>
            <Zapsal>M.A.</Zapsal>
            <Okres>LI</Okres>
            <Region>SC</Region>
          </DSXML>
        </dataroot>
    

1 个答案:

答案 0 :(得分:2)

假设样本输入xml:

<root>
  <datevalue>2013-05-29</datevalue>
</root>

示例XSD代码如下:

<xs:element name="root">
  <xs:complexType>
    <xs:element name='datevalue' minOccurs="0">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:pattern value="[0-2][0-9][0-9][0-9]
                            |[0-2][0-9][0-9][0-9][-][01|02|03|04|05|06|07|08|09|10|11|12]
                            |[0-2][0-9][0-9][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]"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:element>
  </xs:complexType>
</xs:element>

值可以是:

0000 to 2999
or 0000-01 to 2999-12
or 0000-01-01 to 2999-12-31

既然你说可能存在潜在的非现实值,我们必须按原样接受它。我还有一种方法,它有更简单的代码:

<xs:element name="root">
  <xs:complexType>
    <xs:element name='datevalue' minOccurs="0">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:pattern value="[0-2][0-9][0-9][0-9]
                            |[0-2][0-9][0-9][0-9][-][0-1][0-9]
                            |[0-2][0-9][0-9][0-9][-][0-1][0-9][-][0-3][0-9]"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:element>
  </xs:complexType>
</xs:element>

值可以是:

0000 to 2999
or 0000-00 to 2999-12 (to 2999-19)
or 0000-00-00 to 2999-12-31 (to 2999-19-39)