2009-08-20 5 views
13

У меня возникла ситуация, когда элемент в XML-файле может иметь два разных типа в XSD.xsd тот же элемент, разные типы?

Что я хочу сделать, это сначала проверить введенное значение на более строгий тип (если это человек, который заполняет форму), и если это не тянет, проверьте его на менее строгий тип (если это организация, которая заполняет форму), в противном случае пусть проверка не будет выполнена, если она вообще не подтвердится.

Так что это в основном это:

<xsd:complexType name="ForminfoType"> ` 
    <xsd:sequence> 
     <xsd:element name="formname" type="xsd:string" /> 
     <xsd:element name="timestamp" type="xsd:dateTime" /> 
     <xsd:element name="sender" type="PersonType" minOccurs="0" /> 
     <xsd:element name="receiver" type="OrganizationType" minOccurs="0" /> 
     <xsd:element name="signature" type="xsd:string" minOccurs="0" /> 
    </xsd:sequence> 
</xsd:complexType> 

Что PersonType заявляет, в основном 12-значное число, построенные по определенной схеме. То, что объявляет тип организации, представляет собой просто 10-значное число.

Так что я логически хотел бы сделать, это поставить это:

<xsd:element name="sender" type="OrganizationType" minOccurs="0" /> 

в последовательности, но вы не можете иметь два элемента с одинаковым именем и разными типами. Поэтому я считаю, что я должен решить это каким-то другим способом.

То, что я нашел, было это: http://xsd.stylusstudio.com/2007Oct/post05003.htm

Что довольно много, что я хочу сделать, но я не уверен, что это возможно. У кого-нибудь есть дальнейшие идеи о том, как это решить?

Заранее спасибо.

+2

Вы не хотите использовать кавычку для мультих-строк коды. Просто выберите линии и используйте Control-K. –

+1

@Arizon: чтобы правильно форматировать код, выделите его, а затем нажмите кнопку с нулями и единицами (01010 0101010) на панели инструментов над редактором! –

ответ

11

Нет, вы не можете этого сделать. Один из вариантов вы его создать «PersonOrOrgSender» сложного типа вдоль линий:

<xsd:complexType name="PersonOrOrgType"> 
    <xsd:choice> 
     <xsd:element minOccurs="0" name="PersonSender" type="PersonType" /> 
     <xsd:element minOccurs="0" name="OrgSender" type="OrganizationType" /> 
    </xsd:choice> 
    </xsd:complexType> 

, а затем сделать свой «отправитель» экземпляр этого типа:

<xsd:element name="sender" type="PersonOrOrgType" minOccurs="0" /> 

, но тогда вы будете есть XML-данные, как это:

<FormInfo> 
    <formname>string</formname> 
    <sender> 
    <OrgSender> 
     <Name>string</Name> 
    </OrgSender> 
    </sender> 
    ... 
</FormInfo> 

или

<FormInfo> 
    <formname>string</formname> 
    <sender> 
    <PersonSender> 
     <Name>string</Name> 
    </PersonSender> 
    </sender> 
    ... 
</FormInfo> 

Вы не можете создать ни одного тега (например. «отправитель») - одно дело в одном случае, а другое - в другом случае - один тег должен иметь ровно один четко определенный тип и имеет этот тип раз и навсегда.

Marc

+0

Марк, большое спасибо, к сожалению, я столкнулся с другой проблемой. Элементу отправителя не разрешалось иметь дочерний узел, поэтому я решил его, добавив «или» и шаблон организации к типу PersonType. "| [0-9] {10}" привет, Эрик – 2009-08-24 07:04:19

1

Учитывая ваши проблемы, связанные с решением, предоставленной @mark_s, у вас есть несколько вариантов:

  • Создать два отдельных XSDs с двумя типами для sender. В коде, который запускает проверку, запускайте их последовательно (например, человек, затем организация). Это дает дополнительное преимущество в том, что ваш код будет знать, какая проверка прошла (и может делать выбор на основе этих знаний).
  • Переместить выбор уровня в пределах XSD. Внутри ForminfoType добавьте узел выбора с двумя последовательностями (один человек, одна организация).Я не подтвержден, но примерно:

    <xsd:complexType name="ForminfoType"> 
        <xsd:choice> 
         <xsd:sequence> <!-- person --> 
          <xsd:element name="formname" type="xsd:string" /> 
          <xsd:element name="timestamp" type="xsd:dateTime" /> 
          <xsd:element name="sender" type="PersonType" minOccurs="0" /> 
          <xsd:element name="receiver" type="OrganizationType" minOccurs="0" /> 
          <xsd:element name="signature" type="xsd:string" minOccurs="0" /> 
         </xsd:sequence> 
         <xsd:sequence> <!-- organization --> 
          <xsd:element name="formname" type="xsd:string" /> 
          <xsd:element name="timestamp" type="xsd:dateTime" /> 
          <xsd:element name="sender" type="OrganizationType" minOccurs="0" /> 
          <xsd:element name="receiver" type="OrganizationType" minOccurs="0" /> 
          <xsd:element name="signature" type="xsd:string" minOccurs="0" /> 
         </xsd:sequence> 
        </xsd:choice> 
    </xsd:complexType>