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