【问题标题】:Xsd and inheritanceXsd 和继承
【发布时间】:2010-09-17 07:39:13
【问题描述】:

我有一个这样的xsd

<xsd:complexType name="A">  
        <xsd:complexContent>  
            <xsd:sequence>  
                <xsd:element name="options">  
                    <xsd:complexType>  
                        <xsd:sequence>  
                            <xsd:element name="Day">  
                            ...  
                            </xsd:element>  
                        </xsd:sequence>  
                    </xsd:complexType>  
                </xsd:element>  
            </xsd:sequence>  
        </xsd:complexContent>  
</xsd:complexType>  

<xsd:complexType name="B">  
    <xsd:complexContent>
        <xsd:extension base="A">
        ...What would go here...
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>  

所以基本上我希望 A 类有一系列选项(例如 Day、Week)然后我希望 B 从 A 继承并拥有 A 的所有选项以及额外的 2 或 3 个选项,例如小时、秒。

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    这是我想出的架构:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema id="inheritance"
        targetNamespace="http://test.com"
        elementFormDefault="qualified"
        xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:test="http://test.com"
    >
        <xs:element name="Time">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="First" type="test:A" />
                    <xs:element name="Second" type="test:B" />
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    
        <xs:complexType name="shortOptions">
            <xs:sequence>
                <xs:element name="Day" />
            </xs:sequence>
        </xs:complexType>
    
        <xs:complexType name="longOptions">
            <xs:complexContent>
                <xs:extension base="test:shortOptions">
                    <xs:sequence>
                        <xs:element name="Week" />
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    
        <xs:complexType name="A">
            <xs:sequence>
                <xs:element name="options" type="test:shortOptions" />
            </xs:sequence>
        </xs:complexType>
    
        <xs:complexType name="B">
            <xs:sequence>
                <xs:element name="options" type="test:longOptions" />
            </xs:sequence>
        </xs:complexType>
    
    </xs:schema>
    

    这似乎适合这个 xml:

    <?xml version="1.0" encoding="utf-8" ?>
    <Time xmlns="http://test.com">
        <First>
            <options>
                <Day>Today</Day>
            </options>
        </First>
        <Second>
            <options>
                <Day>Tomorrow</Day>
                <Week>This Week</Week>
            </options>
        </Second>
    </Time>
    

    【讨论】:

      【解决方案2】:

      只需添加带有所需元素的&lt;xsd:sequence&gt;

      <xsd:complexType name="B">  
          <xsd:complexContent>
              <xsd:extension base="A">
                 <xsd:sequence>
                    <xsd:element name="Hours">
                    ...
                    </xsd:element>
                 </xsd:sequence>
              </xsd:extension>
          </xsd:complexContent>
      </xsd:complexType>
      

      【讨论】:

        【解决方案3】:

        您需要将选项定义为它自己的复杂类型,然后在其上使用扩展来创建新的选项复杂类型并使用替换而不是扩展。

        【讨论】:

          【解决方案4】:

          您需要为选项创建一个类型,其中包含小时等,然后在 csgero 的答案中添加选项而不是小时。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-15
            • 1970-01-01
            • 2020-10-07
            • 2015-12-09
            相关资源
            最近更新 更多