我们如何使用 XSD 1.1 为以下 XML 编写 XSD 模式,因为使用 XSD 1.0 我遇到了一些问题,因为我们使用具有差异类型(属性名称和类型)的相同元素名称,这在 XSD 1.0 中是无效和模棱两可的,我认为在 XSD 1.1 可能有某种方法(可能是替代方案/断言)来解决这个问题。
<?xml version="1.0" encoding="UTF-8"?>
<SETTINGS>
<CLEANING amount="40"/>
<CLEANING name="abcd"/>
<CLEANING value="0.01"/>
</SETTINGS>
不幸的是,我们无法更改 XML 格式(其中包含具有不同属性类型的多个元素),我们需要为该 XML 编写 XSD 模式,并限制属性值。
根据下面的评论,创建了如下架构,但在验证上述 xml 时仍然出错。
<!-- Created with Liquid Studio 2018 (https://www.liquid-technologies.com) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="SETTINGS" type="settingsType"/>
<xs:element name="CLEANING" type="cleaningType">
<xs:alternative type="amountType" test="exists(@amount)"/>
<xs:alternative type="nameType" test="exists(@name)"/>
<xs:alternative type="valueType" test="exists(@value)"/>
</xs:element>
<xs:complexType name="settingsType">
<xs:sequence>
<xs:element ref="CLEANING" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- Base type -->
<xs:complexType name="cleaningType">
</xs:complexType>
<!-- Type amount -->
<xs:complexType name="amountType">
<xs:complexContent>
<xs:extension base="cleaningType">
<xs:attribute name="amount" type="xs:integer" use="required"/>
<xs:anyAttribute />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- Type name -->
<xs:complexType name="nameType">
<xs:complexContent>
<xs:extension base="cleaningType">
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:anyAttribute />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- Type value -->
<xs:complexType name="valueType">
<xs:complexContent>
<xs:extension base="cleaningType">
<xs:attribute name="value" type="xs:float" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
错误 严重性位置文件名消息
7:66 schema.xsd s4s-elt-must-match.1:“CLEANING”的内容必须匹配(注释?,(simpleType | complexType)?,(unique | key | keyref)*))。发现一个问题开始于:替代。
4:24 sample.xml cvc-complex-type.3.2.2:属性“名称”不允许出现在元素“清洁”中。