XML模式:基于父属性的子元素类型';类型';

XML模式:基于父属性的子元素类型';类型';,xml,xsd,xsd-1.0,Xml,Xsd,Xsd 1.0,我有一个如下所示的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

我有一个如下所示的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>

向上的
5.
0
ZZZZ
0.5464
1.
YYYY
0.464
....
我写了一个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>

当然,这是行不通的。有人建议我在XSD1.1中使用xs:alternative。 但我现在只有libxml2。它不支持XSD1.1


在XSD1.0中我该怎么做?或者它不能完全在XSD 1.0中实现?

条件类型分配(
xs:alternative
)需要XSD 1.1。

在XSD 1.0中不能执行条件类型分配,但如果您愿意调整XML设计,可以使用
xsi:Type
实现类似效果:

XML

向上的
5.
0
ZZZZ
0.5464
1.
YYYY
0.464
XSD 1.0
您可以使用此模式:

<?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>

<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>