3

假设我有以下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 文件生成示例 xml,但我只能看到Name元素而不是Surname预期的元素。谁能告诉它可能的原因是什么,我错过了什么?

  2. 我必须给出另一个名称,FullStdBasicTags用于扩展StdBasicTags和添加新元素。在这种情况下,完整的最终 XML 文件的输出是什么?这个想法是同时拥有NameSurname在同一个父 complexType 之下StdBasicTags

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

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

**更新我很惊讶直到现在没有人给我任何建议。同时我尝试了这个,

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

rootElementNamestandard.xsd 的根元素在哪里。现在添加后,我可以看到其他元素。但现在的问题是,整个 standard.xsd 结构首先出现,然后出现我在 fullStandard.xsd 中重新定义的任何内容,而我只想要它们一次。

请提出一些建议。

4

1 回答 1

1

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

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

  2. 父类型不能引用子类型中添加的新属性。同样的继承原则也适用于此。

请在下面找到示例。

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>
于 2016-01-06T05:38:52.810 回答