我有一个包含多个元素的XML Schema,每个元素都有两个相同类型的子元素(oldValue& newValue)。
例如,类型可以是字符串,但我有几个具有不同maxLength
限制的元素。最简单的定义方法是什么?
<xsd:sequence>
<xsd:element name="foo">
<xs:sequence>
<xs:element name="oldValue" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="newValue">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xsd:element>
<xsd:element name="bar">
<xs:sequence>
<xs:element name="oldValue" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="30"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="newValue">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="30"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xsd:element>
</xsd:sequence>
我需要定义很多这些元素,每个元素都有不同的限制。有没有比为每个限制定义复杂类型更简单的方法?
编辑:我需要使用XML Schema 1.0
答案 0 :(得分:1)
如果可以使用XML Schema 1.1,则assert元素允许您向子结构添加约束。见http://www.w3.org/TR/xmlschema11-1/#cAssertions test属性允许XPath 2.0表达式。 例如:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >
<xs:group name="valuesGroup">
<xs:sequence>
<xs:element name="oldValue" type="xs:string"/>
<xs:element name="newValue" type="xs:string"/>
</xs:sequence>
</xs:group>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="foo">
<xs:complexType>
<xs:group ref="valuesGroup"/>
<xs:assert test="every $x in * satisfies
(string-length($x) <= 30)"/>
</xs:complexType>
</xs:element>
<xs:element name="bar">
<xs:complexType>
<xs:group ref="valuesGroup"/>
<xs:assert test="every $x in * satisfies
(string-length($x) <= 10)"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>