Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在XSD中,如何通过属性值限制枚举?_Xml_Xsd_Xsd 1.1 - Fatal编程技术网

Xml 在XSD中,如何通过属性值限制枚举?

Xml 在XSD中,如何通过属性值限制枚举?,xml,xsd,xsd-1.1,Xml,Xsd,Xsd 1.1,在下面的示例xml/xsd中,当用户输入AnimalCategories的值时,我希望animalbrides中的枚举只允许适当的值。例如,如果用户输入Cat,则动物品种的有效选择应仅为暹罗语和波斯语。我已经回顾了XSD1.1中关于断言和替代方案的文章,但我看不出如何将其应用于我的特定需求 任何想法都将不胜感激 <?xml version="1.0" encoding="UTF-8"?> <AnimalsData xmlns:xsi="http://www.w3.org/200

在下面的示例xml/xsd中,当用户输入AnimalCategories的值时,我希望animalbrides中的枚举只允许适当的值。例如,如果用户输入Cat,则动物品种的有效选择应仅为暹罗语和波斯语。我已经回顾了XSD1.1中关于断言和替代方案的文章,但我看不出如何将其应用于我的特定需求

任何想法都将不胜感激

<?xml version="1.0" encoding="UTF-8"?>
<AnimalsData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="AnimalsData.xsd">
    <AnimalData AnimalCategories="Dog" AnimalBreeds="Boxer"/>
    <AnimalData AnimalCategories="Cat" AnimalBreeds="Siamese"/>
</AnimalsData>


<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1">
    <xs:complexType name="AnimalsDataType">
        <xs:sequence>
            <xs:element ref="AnimalData" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="AnimalDataType">
        <xs:attribute ref="AnimalCategories" use="required"/>
        <xs:attribute ref="AnimalBreeds" use="required"/>
    </xs:complexType>
    <xs:simpleType name="AnimalCategoriesType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Dog"/>
            <xs:enumeration value="Cat"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="AnimalBreedsType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Boxer"/>
            <xs:enumeration value="Rottweiler"/>
            <xs:enumeration value="Siamese"/>
            <xs:enumeration value="Persian"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="AnimalsData" type="AnimalsDataType"/>
    <xs:element name="AnimalData" type="AnimalDataType"/>
    <xs:attribute name="AnimalCategories" type="AnimalCategoriesType"/>
    <xs:attribute name="AnimalBreeds" type="AnimalBreedsType"/>
</xs:schema>


如果您可以枚举类别及其品种,使其可检查的最简单方法是将类别(以及可选品种)的名称用作元素名称,而不是属性值

如果只对类别执行此操作,而不是对品种执行此操作,则XML可能采用如下形式:

<AnimalsData>
  <Dog Breeds="Boxer"/>
  <Cat Breeds="Siamese"/>
</AnimalsData>
<xs:complexType name="Dog">
  <xs:complexContent>
    <xs:restriction base="AnimalDataType">
      <xs:attribute name="AnimalBreeds" 
        use="required" 
        type="DogBreedsType"/>
    </xs:restriction>
  </xs:complexContent>
</xs:complexType>

<xs:simpleType name="DogBreedsType">
  <xs:restriction base="AnimalBreedsType">
    <xs:enumeration value="Boxer"/>
    <xs:enumeration value="Rottweiler"/>
  </xs:restriction>
</xs:simpleType>

<xs:element name="Dog" type="Dog" substitutionGroup="AnimalData"/>
<AnimalsData>
  <Dog><Boxer/></Dog>
  <Cat><Siamese/></Cat>
</AnimalsData>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
           elementFormDefault="qualified" 
           attributeFormDefault="unqualified" 
           vc:minVersion="1.1">
  <xs:complexType name="AnimalsDataType">
    <xs:sequence>
      <xs:element ref="AnimalData" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="AnimalDataType">
    <xs:sequence>
      <xs:element ref="Breed"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Dog">
    <xs:complexContent>
      <xs:restriction base="AnimalDataType">
        <xs:sequence>
          <xs:element ref="CanineBreed"/>
        </xs:sequence>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="Cat">
    <xs:complexContent>
      <xs:restriction base="AnimalDataType">
        <xs:sequence>
          <xs:element ref="FelineBreed"/>
        </xs:sequence>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

  <xs:element name="AnimalsData" type="AnimalsDataType"/>
  <xs:element name="AnimalData" type="AnimalDataType" abstract="true"/>
  <xs:element name="Dog" type="Dog" substitutionGroup="AnimalData"/>
  <xs:element name="Cat" type="Cat" substitutionGroup="AnimalData"/>

  <xs:element name="Breed" abstract="true">
    <xs:complexType><xs:sequence/></xs:complexType>
  </xs:element>
  <xs:element name="CanineBreed" abstract="true" 
              substitutionGroup="Breed"/>
  <xs:element name="FelineBreed" abstract="true" 
              substitutionGroup="Breed"/>
  <xs:element name="Boxer" substitutionGroup="CanineBreed"/>
  <xs:element name="Rottweiler" substitutionGroup="CanineBreed"/>
  <xs:element name="Siamese" substitutionGroup="FelineBreed"/>
  <xs:element name="Persian" substitutionGroup="FelineBreed"/>

</xs:schema>
要使用断言,只需将以下断言添加到
AnimalDataType
的声明中即可:

<xs:complexType name="AnimalDataType">
  <xs:attribute ref="AnimalCategories" use="required"/>
  <xs:attribute ref="AnimalBreeds" use="required"/>

  <xs:assert test="if (@AnimalCategories='Dog')
    then @AnimalBreeds = ('Boxer', 'Rottweiler')
    else true()"/>
  <xs:assert test="if (@AnimalCategories='Cat')
      then @AnimalBreeds = ('Siamese', 'Persian')
      else true()"/>
</xs:complexType>


请注意,这四种变体编码的关于类别和品种之间相关性的信息相同,但在某些情况下,其他软件比其他软件更容易访问这些信息。

如果您想使用其他类型,您可以在下面找到另一个模式示例

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified"
    attributeFormDefault="unqualified" vc:minVersion="1.1">
    <xs:complexType name="AnimalsDataType">
        <xs:sequence>
            <xs:element ref="AnimalData" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="AnimalDataType">
        <xs:attribute ref="AnimalCategories" use="required"/>
    </xs:complexType>
    <xs:complexType name="DogDataType">
        <xs:complexContent>
            <xs:extension base="AnimalDataType">
                <xs:attribute name="AnimalBreeds" type="DogBreedsType" use="required"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="CatDataType">
        <xs:complexContent>
            <xs:extension base="AnimalDataType">
                <xs:attribute name="AnimalBreeds" type="CatBreedsType" use="required"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:simpleType name="AnimalCategoriesType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Dog"/>
            <xs:enumeration value="Cat"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="DogBreedsType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Boxer"/>
            <xs:enumeration value="Rottweiler"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="CatBreedsType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Siamese"/>
            <xs:enumeration value="Persian"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:element name="AnimalsData" type="AnimalsDataType"/>
    <xs:element name="AnimalData" type="AnimalDataType">
        <xs:alternative test="@AnimalCategories='Dog'" type="DogDataType"/>
        <xs:alternative test="@AnimalCategories='Cat'" type="CatDataType"/>
    </xs:element>

    <xs:attribute name="AnimalCategories" type="AnimalCategoriesType"/>
</xs:schema>


您意识到,在XSD中表达约束本身并不能保证“当用户选择一个值”或“仅显示适当的值”,对吗?当然。。。我相应地更新了我的帖子。我刚才指的是在像XMLSply这样的编辑器中自动完成对关联模式的每次验证。请参阅所附图片。
<xs:complexType name="AnimalDataType">
  <xs:attribute ref="AnimalCategories" use="required"/>
  <xs:attribute ref="AnimalBreeds" use="required"/>

  <xs:assert test="if (@AnimalCategories='Dog')
    then @AnimalBreeds = ('Boxer', 'Rottweiler')
    else true()"/>
  <xs:assert test="if (@AnimalCategories='Cat')
      then @AnimalBreeds = ('Siamese', 'Persian')
      else true()"/>
</xs:complexType>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified"
    attributeFormDefault="unqualified" vc:minVersion="1.1">
    <xs:complexType name="AnimalsDataType">
        <xs:sequence>
            <xs:element ref="AnimalData" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="AnimalDataType">
        <xs:attribute ref="AnimalCategories" use="required"/>
    </xs:complexType>
    <xs:complexType name="DogDataType">
        <xs:complexContent>
            <xs:extension base="AnimalDataType">
                <xs:attribute name="AnimalBreeds" type="DogBreedsType" use="required"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="CatDataType">
        <xs:complexContent>
            <xs:extension base="AnimalDataType">
                <xs:attribute name="AnimalBreeds" type="CatBreedsType" use="required"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:simpleType name="AnimalCategoriesType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Dog"/>
            <xs:enumeration value="Cat"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="DogBreedsType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Boxer"/>
            <xs:enumeration value="Rottweiler"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="CatBreedsType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Siamese"/>
            <xs:enumeration value="Persian"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:element name="AnimalsData" type="AnimalsDataType"/>
    <xs:element name="AnimalData" type="AnimalDataType">
        <xs:alternative test="@AnimalCategories='Dog'" type="DogDataType"/>
        <xs:alternative test="@AnimalCategories='Cat'" type="CatDataType"/>
    </xs:element>

    <xs:attribute name="AnimalCategories" type="AnimalCategoriesType"/>
</xs:schema>