【问题标题】:XML Schema: Child element type based on parent attribute 'type'XML 架构:基于父属性“类型”的子元素类型
【发布时间】:2015-11-12 08:57:51
【问题描述】:

我有一个如下的 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 中进行操作?还是绝对不能在 XSD 1.0 中实现?

【问题讨论】:

    标签: xml xsd xsd-1.0


    【解决方案1】:

    条件类型分配 (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>
    

    【讨论】:

      【解决方案2】:

      您可以使用此架构:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-27
        • 1970-01-01
        • 1970-01-01
        • 2011-05-14
        • 2020-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多