XML 架构:基于父属性的子元素类型 'type'
XML Schema: Child element type based on parent attribute 'type'
我有一个 XML 文档,如下所示:
<operation name="func">
<param name="a" type="string">up</param>
<param name="b" type="integer">5</param>
<param name="c" type="CustomList">
<list>
<idx>0</idx>
<name>ZZZZ</name>
<value>0.5464</value>
</list>
<list>
<idx>1</idx>
<name>YYYY</name>
<value>0.464</value>
</list>
....
</param>
</operation>
我写了一个XSD来限制它:
<xs:complexType name="CustomListNode">
<xs:sequence>
<xs:element name="idx" type="xs:integer" />
<xs:element name="name" type="xs:string" />
<xs:element name="value" type="xs:decimal" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="CustomList">
<xs:sequence>
<xs:element name="list" type="CustomListNode" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="operation">
<xs:complexType>
<xs:sequence>
<xs:element name="param" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:NOTATION">
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="type" type="xs:integer" use="required" />
<xs:attribute name="type" type="xs:string" use="required" />
<xs:attribute name="type" type="CustomList" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
当然,这不行。有人建议我在 XSD 1.1 中使用 xs:alternative
。
但我现在只有 libxml2。不支持 XSD 1.1.
我在 XSD 1.0 中可以做什么?还是绝对不能在XSD1.0中实现?
条件类型分配 (xs:alternative
) 需要 XSD 1.1.
您无法在 XSD 1.0 中执行条件类型分配,但如果您愿意调整 XML 设计,则可以使用 xsi:type
来实现类似的效果:
XML
<?xml version="1.0" encoding="UTF-8"?>
<operation xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
name="func">
<a xsi:type="xs:string">up</a>
<b xsi:type="xs:integer">5</b>
<c xsi:type="CustomList">
<list>
<idx>0</idx>
<name>ZZZZ</name>
<value>0.5464</value>
</list>
<list>
<idx>1</idx>
<name>YYYY</name>
<value>0.464</value>
</list>
</c>
</operation>
XSD 1.0
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="operation">
<xs:complexType>
<xs:sequence>
<xs:any maxOccurs="unbounded" processContents="lax"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:complexType name="CustomList">
<xs:sequence>
<xs:element name="list" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="idx" type="xs:integer"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="value" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
您可以使用此架构:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="operation">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="param">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="idx" type="xs:integer" />
<xs:element name="name" type="xs:string" />
<xs:element name="value" type="xs:decimal" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="type" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:schema>
我有一个 XML 文档,如下所示:
<operation name="func">
<param name="a" type="string">up</param>
<param name="b" type="integer">5</param>
<param name="c" type="CustomList">
<list>
<idx>0</idx>
<name>ZZZZ</name>
<value>0.5464</value>
</list>
<list>
<idx>1</idx>
<name>YYYY</name>
<value>0.464</value>
</list>
....
</param>
</operation>
我写了一个XSD来限制它:
<xs:complexType name="CustomListNode">
<xs:sequence>
<xs:element name="idx" type="xs:integer" />
<xs:element name="name" type="xs:string" />
<xs:element name="value" type="xs:decimal" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="CustomList">
<xs:sequence>
<xs:element name="list" type="CustomListNode" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="operation">
<xs:complexType>
<xs:sequence>
<xs:element name="param" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:NOTATION">
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="type" type="xs:integer" use="required" />
<xs:attribute name="type" type="xs:string" use="required" />
<xs:attribute name="type" type="CustomList" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
当然,这不行。有人建议我在 XSD 1.1 中使用 xs:alternative
。
但我现在只有 libxml2。不支持 XSD 1.1.
我在 XSD 1.0 中可以做什么?还是绝对不能在XSD1.0中实现?
条件类型分配 (xs:alternative
) 需要 XSD 1.1.
您无法在 XSD 1.0 中执行条件类型分配,但如果您愿意调整 XML 设计,则可以使用 xsi:type
来实现类似的效果:
XML
<?xml version="1.0" encoding="UTF-8"?>
<operation xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
name="func">
<a xsi:type="xs:string">up</a>
<b xsi:type="xs:integer">5</b>
<c xsi:type="CustomList">
<list>
<idx>0</idx>
<name>ZZZZ</name>
<value>0.5464</value>
</list>
<list>
<idx>1</idx>
<name>YYYY</name>
<value>0.464</value>
</list>
</c>
</operation>
XSD 1.0
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="operation">
<xs:complexType>
<xs:sequence>
<xs:any maxOccurs="unbounded" processContents="lax"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:complexType name="CustomList">
<xs:sequence>
<xs:element name="list" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="idx" type="xs:integer"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="value" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
您可以使用此架构:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="operation">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="param">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="idx" type="xs:integer" />
<xs:element name="name" type="xs:string" />
<xs:element name="value" type="xs:decimal" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="type" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:schema>