如何根据同一元素中另一个属性的值设置属性的类型。
有一种形式看起来像:
<Products>
<Product ProductCodeType="Default" ProductCode"789" />
<Product ProductCodeType="Manufacturer" ProductCode"1234567891011" />
<Product ProductCodeType="Supplier" ProductCode"Big1324" />
<Product ProductCodeType="Default" ProductCode"7777777" />
</Products>有三种不同类型的产品代码,它们必须符合由ProductCodeType属性标识的不同定义。
我已经研究过关于条件类型分配和选择的断言和替代方案。我可能错过了一些简单而明显的东西。
对于传统观点,我建议忽略下面的XSD示例,因为它们并没有使我更接近于解决方案。
<xs:element name="Products" type="Prods" />
<xs:complexType name="Prods">
<xs:sequence>
<xs:element name="Product" maxOccurs="unbounded" type="abstractType" />
</xs:sequence>
</xs:complexType>替代办法:
<xs:complexType name="Prod">
<xs:attribute name="ProductCodeType" type="ProdCoTyp"/>
<xs:attribute name="ProductCode" >
<xs:alternative test="@ProductCodeType = 'Default'" type="def" />
<xs:alternative test="@ProductCodeType = 'Manufacturer'" type="manu" />
<xs:alternative test="@ProductCodeType = 'Supplier'" type="sup" />
</xs:attribute>
</xs:complexType>摘要备选方案:
<xs:complexType name="abstractType" abstract="true">
<xs:attribute name="ProductCodeType" type="ProdCoTyp"/>
</xs:complexType>
<xs:complexType name="Switch">
<xs:complexContent>
<xs:extension base="abstractType">
<xs:attribute name="ProductCode">
<xs:simpleType>
<xs:alternative test="@ProductCodeType = 'Default'" type="def" />
<xs:alternative test="@ProductCodeType = 'Manufacturer'" type="manu" />
<xs:alternative test="@ProductCodeType = 'Supplier'" type="sup" />
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:complexContent>
</xs:complexType>抽象断言
<xs:complexType name="abstractType" abstract="true">
<xs:attribute name="ProductCodeType" type="Prod"/>
</xs:complexType>
<xs:complexType name="deft">
<xs:complexContent>
<xs:extension base="abstractType">
<xs:attribute name="ProductCode" type="def" />
<xs:assert test="@ProductCodeType = 'Default'"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="manuf">
<xs:complexContent>
<xs:extension base="abstractType">
<xs:attribute name="ProductCode" type="Manufacturer" />
<xs:assert test="@ProductCodeType = 'manu'"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="suppr">
<xs:complexContent>
<xs:extension base="abstractType">
<xs:attribute name="ProductCode" type="Supplier" />
<xs:assert test="@ProductCodeType = 'sup'"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>-产品代码类型枚举和类型定义。
<xs:simpleType name="ProdCoTyp">
<xs:restriction base="xs:string">
<xs:enumeration value="Default"/>
<xs:enumeration value="Manufacturer"/>
<xs:enumeration value="Supplier"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="def">
<xs:restriction base="xs:integer">
<xs:minExclusive value="99"/>
<xs:maxInclusive value="9999999"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="manu">
<xs:restriction base="xs:integer">
<xs:minExclusive value="999999999999"/>
<xs:maxInclusive value="9999999999999"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="sup" >
<xs:restriction base="xs:string">
<xs:pattern value="[0-9a-zA-Z]*" />
</xs:restriction>
</xs:simpleType>为了清晰起见,我得到了类似但不限于以下的错误消息:
S4s-elt必须匹配1:“simpleType”的内容必须匹配(注释?(限制列表))。一个问题出现在: Alternative。
和
S4s-elt必须匹配1:'ProductCode‘的内容必须匹配(注释?,(simpleType?))。一个问题出现在: Alternative。
和
S4s-ELT-无效-内容1:“灵巧”的内容无效。元素'assert‘是无效的,错误的,或者发生得太频繁。
这些错误消息表示没有实现验证属性的条件类型分配的目标的不幸状态。我正在使用在线工具,根据一个模拟的XML文档验证我的XSD。
发布于 2018-05-02 14:43:02
好的,由于使用了<xs:alternative>s,这是您想要实现的一个拟议模式--我在您的一些尝试的基础上构建了这个模式,以检索属性的简单类型定义。
我在模式中添加了一些注释,为您提供了一些解释。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
<xs:element name="Products" type="Prods" />
<xs:complexType name="Prods">
<xs:sequence>
<xs:element ref="Product" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<!-- Calling alternative definitions, depending on the ProductCodeType value -->
<xs:element name="Product" type="Prod">
<xs:alternative test="@ProductCodeType = 'Default'" type="ProdDefault"/>
<xs:alternative test="@ProductCodeType = 'Manufacturer'" type="ProdManufacturer"/>
<xs:alternative test="@ProductCodeType = 'Supplier'" type="ProdSupplier"/>
</xs:element>
<!-- Definition for the ProductCodeType attribute -->
<xs:simpleType name="ProdCoTyp">
<xs:restriction base="xs:string">
<xs:enumeration value="Default"/>
<xs:enumeration value="Manufacturer"/>
<xs:enumeration value="Supplier"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="Prod" abstract="true">
<xs:attribute name="ProductCodeType" type="ProdCoTyp"/>
</xs:complexType>
<!-- The alternative content definitions for a <Product> -->
<xs:complexType name="ProdDefault">
<xs:complexContent>
<xs:extension base="Prod">
<xs:attribute name="ProductCode" type="def"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ProdManufacturer">
<xs:complexContent>
<xs:extension base="Prod">
<xs:attribute name="ProductCode" type="manu"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ProdSupplier">
<xs:complexContent>
<xs:extension base="Prod">
<xs:attribute name="ProductCode" type="sup"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- the definitions for the Default, Manufacturer and Supplier-specific @ProductCode -->
<xs:simpleType name="def">
<xs:restriction base="xs:integer">
<xs:minExclusive value="99"/>
<xs:maxInclusive value="9999999"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="manu">
<xs:restriction base="xs:integer">
<xs:minExclusive value="999999999999"/>
<xs:maxInclusive value="9999999999999"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="sup" >
<xs:restriction base="xs:string">
<xs:pattern value="[0-9a-zA-Z]*" />
</xs:restriction>
</xs:simpleType>
</xs:schema>https://stackoverflow.com/questions/50102127
复制相似问题