联合元素验证XML Schema

时间:2016-11-29 23:20:25

标签: xml xsd xsd-validation xml-validation

在使用this在线验证程序验证我的文件时,我收到以下错误消息:

  

cvc-datatype-valid.1.2.3:' Gomorra 20140506'不是有效值   工会类型'#AnonType_alternatywny_tekstzdjecie'。

     

cvc-type.3.1.3:价值' Gomorra 20140506'元素   ' alternatywny_tekst'无效。

我在w3schools的例子中编写了我的代码。谁能告诉我我的代码有什么问题?

<xs:element name="zdjecie">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="wysokosc" type="xs:decimal"/>
      <xs:element name="szerokosc" type="xs:decimal"/>
      <xs:element ref="zrodlo"/>
      <xs:element name="alternatywny_tekst">
        <xs:simpleType>
          <xs:union memberTypes="tekst_1 tekst_2"/>
        </xs:simpleType>
      </xs:element>
    </xs:sequence>
    <xs:attribute ref="kod"/>
  </xs:complexType>
</xs:element>

<xs:simpleType name="tekst_1">
  <xs:restriction base="xs:string">
    <xs:enumeration value="Gomorra"/>
    <xs:enumeration value="Grand Budapest Hotel"/>
    <xs:enumeration value="Fargo"/>
    <xs:enumeration value="Wściekłe psy"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="tekst_2">
  <xs:restriction base="xs:integer">
    <xs:maxExclusive value="20161130"/>
  </xs:restriction>
</xs:simpleType>

XML

<zdjecie kod="GO.2014.001">
  <wysokosc>735</wysokosc>
  <szerokosc>500</szerokosc>
  <zrodlo>Obrazki/gomorra.jpg</zrodlo>
  <alternatywny_tekst>Gomorra 20140506</alternatywny_tekst>
</zdjecie>

1 个答案:

答案 0 :(得分:2)

xs:union的值空间是其成员类型的并集,但仅凭它不允许存在多个成员。从您的XML中,您似乎希望允许多个成员。您可以通过xs:list

实现此目的
    <xs:element name="alternatywny_tekst">
      <xs:simpleType>
        <xs:list>
          <xs:simpleType>
            <xs:union memberTypes="tekst_1 tekst_2"/>
          </xs:simpleType>
        </xs:list>
      </xs:simpleType>
    </xs:element>

请注意,这允许合并tekst_1tekst_2所允许的值的组合 - 不一定是tekst_1后跟tekst_2

以上是完整XSD上下文中的声明,它将成功验证您的XML:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="zdjecie">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="wysokosc" type="xs:decimal"/>
        <xs:element name="szerokosc" type="xs:decimal"/>
        <xs:element name="zrodlo" type="xs:string"/>
        <xs:element name="alternatywny_tekst">
          <xs:simpleType>
            <xs:list>
              <xs:simpleType>
                <xs:union memberTypes="tekst_1 tekst_2"/>
              </xs:simpleType>
            </xs:list>
          </xs:simpleType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="kod" type="xs:string"/>
    </xs:complexType>
  </xs:element>
  <xs:simpleType name="tekst_1">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Gomorra"/>
      <xs:enumeration value="Grand Budapest Hotel"/>
      <xs:enumeration value="Fargo"/>
      <xs:enumeration value="Wściekłe psy"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="tekst_2">
    <xs:restriction base="xs:integer">
      <xs:maxExclusive value="20161130"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>