在 XSD 中使用 xs:extension 和 xs:restriction
Using xs:extension and xs:restriction in a XSD
我想在我的 XSD 中同时使用 xs:extensions
和 xs:restriction
来实现下面提到的 XML
<?xml version="1.0" encoding="utf-8"?>
<records>
<row id="1">
<record>
<Value class="field">486.89</Value>
</record>
<record>
<Value class="field">811.49</Value>
</record>
</row>
<row id="2">
<record>
<Value class="field">123.45</Value>
</record>
<record>
<Value class="field">678.91</Value>
</record>
</row>
</records>
下面是 XSD 我正在尝试:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="records">
<xs:complexType>
<xs:sequence>
<xs:element name="row">
<xs:complexType>
<xs:sequence>
<xs:element name="record" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="Value">
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:totalDigits value="12"/>
<xs:fractionDigits value="2" />
</xs:restriction>
</xs:simpleType>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute type="xs:string" name="class" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:byte" name="id" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
上面的XSD没有用,这是我在这里找到的解决方案Using xs:extension & xs:restriction together?。它抛出错误 'complexType' 元素已存在于内容模型中。
您必须全局定义和命名您希望扩展的受限 xs:simpleType
,而不是在 Value
下局部定义。
另请注意,在 row
上,您需要 maxOccurs="unbounded"
(或大于 1
的默认值)。
总而言之,此 XSD 将成功验证您的 XML:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="Decimal12.2">
<xs:restriction base="xs:decimal">
<xs:totalDigits value="12"/>
<xs:fractionDigits value="2" />
</xs:restriction>
</xs:simpleType>
<xs:element name="records">
<xs:complexType>
<xs:sequence>
<xs:element name="row" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="record" maxOccurs="unbounded"
minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="Value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="Decimal12.2">
<xs:attribute type="xs:string"
name="class"
use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:byte" name="id" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
我想在我的 XSD 中同时使用 xs:extensions
和 xs:restriction
来实现下面提到的 XML
<?xml version="1.0" encoding="utf-8"?>
<records>
<row id="1">
<record>
<Value class="field">486.89</Value>
</record>
<record>
<Value class="field">811.49</Value>
</record>
</row>
<row id="2">
<record>
<Value class="field">123.45</Value>
</record>
<record>
<Value class="field">678.91</Value>
</record>
</row>
</records>
下面是 XSD 我正在尝试:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="records">
<xs:complexType>
<xs:sequence>
<xs:element name="row">
<xs:complexType>
<xs:sequence>
<xs:element name="record" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="Value">
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:totalDigits value="12"/>
<xs:fractionDigits value="2" />
</xs:restriction>
</xs:simpleType>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute type="xs:string" name="class" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:byte" name="id" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
上面的XSD没有用,这是我在这里找到的解决方案Using xs:extension & xs:restriction together?。它抛出错误 'complexType' 元素已存在于内容模型中。
您必须全局定义和命名您希望扩展的受限 xs:simpleType
,而不是在 Value
下局部定义。
另请注意,在 row
上,您需要 maxOccurs="unbounded"
(或大于 1
的默认值)。
总而言之,此 XSD 将成功验证您的 XML:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="Decimal12.2">
<xs:restriction base="xs:decimal">
<xs:totalDigits value="12"/>
<xs:fractionDigits value="2" />
</xs:restriction>
</xs:simpleType>
<xs:element name="records">
<xs:complexType>
<xs:sequence>
<xs:element name="row" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="record" maxOccurs="unbounded"
minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="Value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="Decimal12.2">
<xs:attribute type="xs:string"
name="class"
use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:byte" name="id" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>