Запросы, связанные с расширением ‹complexType› из одного XSD в другой

скажем, у меня есть фрагмент кода ниже 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, который включает указанный выше файл и добавляет дополнительный элемент к указанному выше сложному типу 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 для создания образца XML для файла fullStandard.xsd, но я вижу только элемент Name, а не элемент Surname, как ожидалось. Может ли кто-нибудь сказать, какова возможная причина этого, что мне не хватает?

  2. Мне нужно указать другое имя, FullStdBasicTags, для расширения StdBasicTags и добавления нового элемента. Что в этом случае будет выводом полного окончательного XML-файла? Идея состоит в том, чтобы и Name, и Surname находились под одним и тем же родительским комплексным типом StdBasicTags.

  3. Наконец, что-то не так с архитектурой/выводом, который я ожидаю?

Обратите внимание**, что оба файла проверяются правильно. Также идея состоит в том, чтобы добиться того, что я только что упомянул, не внося никаких изменений в файл 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, а я просто хочу, чтобы все они были сразу.

Пожалуйста, предложите что-нибудь.


person Dish    schedule 24.12.2015    source источник
comment
Покажите полные документы схемы XML, которые мы можем использовать для воспроизведения вашей проблемы. Например, определение типа String не показано. Будет полезен образец XML-документа, который вы хотите проверить на соответствие fullstandard.xsd. Дополнительная помощь здесь: stackoverflow.com/help/mcve.   -  person Mathias Müller    schedule 04.01.2016
comment
Привет @Mathias Müller, String не что иное, как xs:string. Я отредактировал вопрос. Я надеюсь, что теперь это минимальный, полный и проверяемый пример.   -  person Dish    schedule 05.01.2016


Ответы (1)


Пожалуйста, найдите ответы на свои вопросы ниже.

  1. Возможной причиной является тип элемента. Тип должен быть FullStdBasicTags, если вы используете StdBasicTags.

  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>
person Shyamkumar    schedule 06.01.2016
comment
Спасибо за ваше время. Однако второй файл FullSchema.xsd недействителен со следующей ошибкой: src-include.2.1: The included schema's target namespace 'http://www.example.org/StdSchema' must be absent or match the including schema's value 'http://www.example.org/FullSchema'. Я пробовал подобное раньше, но эта ошибка не позволяет проверить файл. любая идея, что можно сделать здесь? Я пробовал несколько комбинаций пространств имен в обоих файлах. - person Dish; 06.01.2016
comment
Я удалил тег <!--<include schemaLocation="StdSchema.xsd"/>--> из FullSchema.xsd, теперь он действителен. - person Dish; 06.01.2016
comment
Почему редактирование было отклонено? Где вы видели теги ‹include› и ‹import› одного и того же типа в файле xsd. Одному нужно, чтобы targetNameSpace было одинаковым, а другому нужно, чтобы они были разными. Пожалуйста, проверьте файлы один раз, прежде чем отклонить любое редактирование!!!! - person Dish; 07.01.2016