【发布时间】:2014-10-18 17:25:23
【问题描述】:
编辑是为了制作一个完整的架构,如果需要,可以按照下面的 cmets 中的建议进行测试
假设我有一个小的 XML 模式定义如下:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
targetNamespace="tns:grades"
elementFormDefault="qualified"
xmlns:tns="tns:grades"
vc:minVersion="1.1">
<xs:element name="grades">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:grade" minOccurs="0" maxOcccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="grade">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:double">
<xs:attribute name="type" type="tns:gradeType" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:simpleType name="gradeType">
<xs:restriction base="xs:string">
<xs:pattern value="simple|complex"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="simple">
<xs:restriction base="xs:double">
<xs:pattern value="1.0|1.3|1.7|2.0|2.3|2.7|3.0|3.3|3.7|4.0|4.7|5.0"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="complex">
<xs:restriction base="xs:double">
<xs:minInclusive value="1.0"/>
<xs:maxInclusive value="5.0"/>
</xs:restriction>
</xs:simpleType>
</schema>
类型 gradeType 用于确定 grade 元素的值如何限制以及如何评估它。我想要做的是使用上面指定的 simple 和 complex 类型作为 gradeType 的两个派生。由于评分标准的限制,简单类型的评分只允许我使用一组有限的选项。另一方面,complex 类型基本上允许我在 1.0 和 5.0 之间有一个无限的区间,因为我使用它来计算多个 simple 等级的算术平均值并将其四舍五入到最接近的值simple 等级在 XSLT 中可用。但是我不知道如何更改我的 gradeType 以便在创建一个简单类型 simple 和 complex 时可以使用等级元素。我已经阅读了有关从基类(此处:gradeType)派生类型(此处:simple,complex)的信息,但似乎我根本没有不明白。
我想象的 grade 应该是什么样子的示例:
<grades>
<grade type="simple">1.7</grade>
<grade type="simple">2.0</grade>
<grade type="complex">1.4</grade>
<grade type="simple">5.0</grade>
<grade type="complex">4.6</grade>
</grades>
编辑 如下所示,xs:union 元素已经过测试:
<xs:simpleType name="gradeType">
<xs:union memberTypes="tns:simple tns:complex"/>
</xs:simpleType>
这导致我的 XML 文档中的所有 grade 元素出现以下两个错误:
cvc-datatype-valid.1.2.3:“simple”不是联合类型“gradeType”的有效值。
cvc-attribute.3:元素“grade”上的属性“type”的值“simple”相对于其类型“gradeType”无效。
编辑 2: 正如@lexicore 所指出的,我或多或少都错了,或者可能只是解释得很糟糕。我将尝试使用伪代码来描述 grade 元素应该如何工作:
if gradeType == "simple"
value of GRADE has to obey the rules defined by the SIMPLE type
else if gradeType == "complex"
value of GRADE has to obey the rules defined by the COMPLEX type
【问题讨论】:
标签: xml xsd complextype derived-types simpletype