2015-12-24 5 views
3

давайте скажем я ниже standard.xsd файла кусок кода,Запросы похожие на расширение <complexType> из одного 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 инструмент для создания образца 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, появляется, а я просто хочу, чтобы все они были на один раз.

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

+0

Пожалуйста показать ** ** полный XML Schema документы, которые мы можем использовать, чтобы воспроизвести проблему. Например, определение типа 'String' не показано. Образец XML-документа, который вы хотите быть действительным в отношении fullstandard.xsd, будет полезен. Больше помощи здесь: http://stackoverflow.com/help/mcve. –

+0

Привет @Mathias Müller, 'String' не что иное, как' xs: string'. Я отредактировал вопрос. Надеюсь, теперь это минимальный, полный и проверенный пример. – Dish

ответ

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> 
+0

Спасибо за ваше время. Однако второй файл 'FullSchema.xsd' недопустим со следующей ошибкой: ' src-include.2.1: целевое пространство имен включенных схем 'http://www.example.org/StdSchema' должно отсутствовать или соответствовать включенному значение схемы "http: // www.example.org/FullSchema'.' Я раньше пробовал аналогичную вещь, но эта ошибка не позволяет проверить файл. любая идея, что можно сделать здесь? Я пробовал несколько комбинаций пространств имен в обоих файлах. – Dish

+0

Я удалил \t ' -> тег из FullSchema.xsd, теперь он действителен. – Dish

+0

Почему было отклонено изменение? Где вы видели как , так и теги, представленные в одном и том же виде в файле xsd. Нужно, чтобы targetNameSpace был таким же, а другой - другим. Пожалуйста, перейдите и проверьте файлы один раз, прежде чем отклонять любое редактирование !!!! – Dish