Xml 如何根据同级属性值选择XSD属性类型
如何基于同一元素中另一个属性的值设置属性的类型 有一个表单如下所示:Xml 如何根据同级属性值选择XSD属性类型,xml,xsd,Xml,Xsd,如何基于同一元素中另一个属性的值设置属性的类型 有一个表单如下所示: <Products> <Product ProductCodeType="Default" ProductCode"789" /> <Product ProductCodeType="Manufacturer" ProductCode"1234567891011" /> <Product ProductCodeType="Supplier" ProductCod
<Products>
<Product ProductCodeType="Default" ProductCode"789" />
<Product ProductCodeType="Manufacturer" ProductCode"1234567891011" />
<Product ProductCodeType="Supplier" ProductCode"Big1324" />
<Product ProductCodeType="Default" ProductCode"7777777" />
</Products>
有三种不同类型的产品代码,它们必须分别符合ProductCodeType属性标识的不同定义
- 默认值是从三位数到七位数的数字
- 制造也是数字,但必须始终为13位数字
- 供应商为字母数字,没有定义长度
<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="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”的内容必须匹配(注释?,(限制|列表|并集))。发现问题始于:备选方案
及
S4s elt必须匹配。1:“ProductCode”的内容必须匹配(注释?,(simpleType?)。发现问题始于:备选方案
及
S4s elt无效内容。1:“deft”的内容无效。元素“assert”无效、放错位置或出现频率过高
这些错误消息表示一种不幸的状态,在这种状态下,验证属性的条件类型分配的目标没有实现。
我正在使用在线工具根据模拟XML文档验证我的XSD。好的,这是您想要实现的一个建议模式,多亏了
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>
尝试澄清您的问题,XML无效吗?完全没有xml?XML模式定义,所以我不会为您构建XML,它只是用约束等来定义它。但XML是用代码构建的。xs:assert
或xs:alternative
应该是实现您所需的正确方法;但是,它们仅在XSD1.1中被识别。因此检查:1)您正确地用这个版本声明了您的模式;2) 确保您的解析器支持XSD-1.1。据我所知,模式声明正确。至于解析器,这些是免费的在线工具,它们不会公布它们支持的版本,尽管当我将一个版本与另一个版本进行比较时,它们给出了相同的错误消息。在任何可用的在线验证工具中,我都无法做到这一点。我发现了一个相关的电子邮件线程,这表明这是不可能的。你用过哪一种?我已经测试了一两个,没有发现任何符合XSD 1.1的,因此得到了一条消息,比如从:Alternative.开始发现问题。。我用oXygenXML编辑器开发了这个模式,对我来说,它工作正常,使用ApacheXerces验证XML和模式。您使用的是哪个解析器/库。我使用的站点是freeformatter.com/xml-validator-xsd.html,它没有说明它支持的valitator版本。这也给出了类似的信息。我没有访问oXygenXML或Xerces库的权限,但我会研究如何获取这些。我不能保证,但对我来说,这个验证器不支持XSD 1.1。试试ApacheXerces,我已经找到了一种利用ApacheXerces的方法,并且已经成功了。非常感谢。