有关将<complextype>从一个XSD扩展到另一个XSD的查询

时间:2015-12-24 06:49:47

标签: xml xsd xml-parsing xmlspy

我们说我的standard.xsd文件片段下面有

<xs:complexType name="StdBasicTags">
        <xs:sequence>
            <xs:element name="Name" type="xs:string" nillable="true">
                <xs:annotation>
                    <xs:documentation>Name</xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

现在我有另一个XSD文件,该文件包含在上面的文件中,并在上面的complexType StdBasicTags

中添加了一些额外的元素

文件名为fullStandard.xsd,我扩展StdBasicTags的方式如下:

<xs:include schemaLocation="standard.xsd"/>
........
........
    <xs:complexType name="FullStdBasicTags">
            <xs:complexContent>
                <xs:extension base="StdBasicTags">
                    <xs:sequence>
                        <xs:element name="Surname" type="xs:string">
                            <xs:annotation>
                                <xs:documentation>Last name</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>

我有以下问题,

  1. 我使用许可的Altova XmlSpy工具为fullStandard.xsd文件生成Sample xml,但我只能按预期看到Name元素而不是Surname元素。任何人都可以告诉它可能的原因是什么,我错过了什么?

  2. 我必须提供FullStdBasicTags的另一个名称来扩展StdBasicTags并添加新元素。在这种情况下,完整的最终XML文件的输出是什么?我们的想法是将NameSurname放在相同的父complexType StdBasicTags下。

  3. 最后,我期待的架构/输出有什么问题吗?

  4.   

    注意**两个文件都经过正确验证。另外,我的想法是在不对standard.xsd文件进行任何更改的情况下实现我刚才提到的内容。

    **更新 我很惊讶到现在为止没有人向我提出任何建议。与此同时,我尝试了这个,

       <xs:element name="FullNewRoot">
        <xs:complexType>
          <xs:sequence>
              <xs:element ref="rootElementName"/>
          </xs:sequence>
        </xs:complexType>
       </xs:element>
    

    其中rootElementName是standard.xsd的根元素。现在添加此内容后,我可以看到其他元素。但现在麻烦的是,整个standard.xsd结构首先出现,然后我在fullStandard.xsd中重新定义的内容出现了,而我只想要它们一次。

    请提出建议。

1 个答案:

答案 0 :(得分:1)

请在下面找到您的问题的答案。

  1. 可能的原因是元素的类型。如果您使用StdBasicTags,则类型应为FullStdBasicTags。

  2. 父类型不能引用子类型中添加的新属性。这里适用相同的继承原则。

  3. 请查看以下示例。

    StdSchema.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/StdSchema"
        xmlns:tns="http://www.example.org/StdSchema" elementFormDefault="qualified">
        <complexType name="StdBasicTags">
            <sequence>
                <element name="Name" type="string" nillable="true">
                    <annotation>
                        <documentation>Name</documentation>
                    </annotation>
                </element>
            </sequence>
        </complexType>
    </schema>
    

    FullSchema.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/FullSchema"
        xmlns:tns="http://www.example.org/FullSchema" elementFormDefault="qualified"
        xmlns:tst="http://www.example.org/StdSchema">
        <include schemaLocation="StdSchema.xsd" />
        <import schemaLocation="StdSchema.xsd" namespace="http://www.example.org/StdSchema"></import>
        <complexType name="FullStdBasicTags">
            <complexContent>
                <extension base="tst:StdBasicTags">
                    <sequence>
                        <element name="Surname" type="string">
                            <annotation>
                                <documentation>Last name</documentation>
                            </annotation>
                        </element>
                    </sequence>
                </extension>
            </complexContent>
        </complexType>
    
        <element name="TestTag" type="tns:FullStdBasicTags"/>
    </schema>
    

    示例XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <tns:TestTag xmlns:tns="http://www.example.org/FullSchema" xmlns:tns1="http://www.example.org/StdSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/FullSchema FullSchema.xsd ">
      <tns1:Name>tns1:Name</tns1:Name>
      <tns:Surname>tns:Surname</tns:Surname>
    </tns:TestTag>