2015-02-24 4 views
0

Проблема в том, что я использую XS: все потому, что элементы могут быть в любом порядке. Я не могу поставить MaxOccurs на который ссылается элемент:Схема XSD: MaxOccurs по ссылочному элементу под xs: all

<xs:element name="PersonInfo"> 
    <xs:complexType> 
     <xs:all> 
      <xs:element name="Addr" type="AdressType" minOccurs="0" maxOccurs="unbounded" /> 

     </xs:all> 
     <xs:attribute name="id" type="xs:ID" use="optional" /> 
     <xs:attribute name="Test" type="xs:string" use="optional" /> 

    </xs:complexType> 
</xs:element> 

<xs:complexType name="AdressType"> 
    <xs:all> 
     <xs:element name="BuildingAptNumber" type="xs:string" minOccurs="0" /> 
     <xs:element name="Addr1" type="xs:string" minOccurs="0" /> 
     <xs:element name="City" type="xs:string" minOccurs="0" /> 
     <xs:element name="StateProvCd" type="xs:string" minOccurs="0" /> 
     <xs:element name="PostalCode" type="xs:string" minOccurs="0" /> 
    </xs:all> 
    <xs:attribute name="AddrTypeCd" type="xs:string" use="optional" /> 
</xs:complexType> 

Если элемент не сослались я смог бы уйти с использованием ComplexType. Есть ли способ ссылаться на элемент и иметь maxoccurs под xs: all?

EDIT: Единственный способ я вижу, чтобы добавить MaxOccurs является использование ComplexType и определить хз: выбор внутри сложного типа:

 <xs:element name="Test" minOccurs="0"> 
       <xs:complexType> 
        <xs:choice maxOccurs="unbounded"> 
         <xs:element name="Addr" type="PMICADDRESS"/> 
        </xs:choice> 
       </xs:complexType> 

      </xs:element> 

Так что вопрос в том, что я не знаю, как объявить сложный тип элемента addr. Единственное решение, которое я нашел, это изменить на xsd 1.1. Я не смог обновить XSD 1.1. все же. Я нашел нить, которая выручает: Middle way between XSD all and XSD sequence

ответ

1

Если элемент не сослались я смог бы уйти с использованием ComplexType

Нет, вы все еще не мог иметь maxOccurs="unbounded" на xs:element под xs:all.

Есть ли способ ссылки на элемент и иметь maxoccurs под xs: все?

Нет, xs:element под xs:all может быть только 0 или 1.


Update относительно хз: выбор идеи в комментариях:

Я мог бы использовать xs:choice и создать элемент вместо ссылки существующий (не идеальный как ссылка используется несколько точек). Я , пытаясь выяснить, есть ли способ использовать ссылку на элемент с xs:choice.

Если ваш приоритет, чтобы избежать упорядоченность и по-прежнему позволяют несколько Addr элементов под PersonInfo, да, вы могли бы использовать xs:choice с maxOccurs="unbounded":

<xs:choice maxOccurs="unbounded"> 
    <xs:element name="Addr" type="AdressType"/> 
    <xs:element name="e1"/> 
    <xs:element name="e2"/> 
    </xs:choice> 

Заметим, однако, что в отличие от xs:all, здесь Addr или e1 или e2 может быть опущен. В этой конкретной конфигурации e1 и e2 также могут повторяться. См. minOccurs and maxOccurs on elements inside xsd:choice о том, как интерпретировать maxOccurs на xsd:choice и его детей xsd:element, если вы хотите изучить другие комбинации. Наконец, вы можете выделить элементы xs:all до или после секвенсированного набора элементов, где вы можете разрешить мощность больше 1.

+0

MSDN говорит: « Любое значение для атрибута maxOccurs, отличного от 1., недействительно. Xsd.exe сообщает об ошибке для недопустимого значения». https://msdn.microsoft.com/en-us/library/d3hx2s7e%28v=vs.85%29.aspx. Я также получаю сообщение об ошибке. Я использую визуальную студию и код C# для проверки XSD. – james31rock

+0

Ваша цитата MSDN применяется к самому элементу 'xs: all', а не к его дочерним элементам' xs: element', которые могут иметь maxXccurs 0 или 1, так как я заявил. (Кроме того, пожалуйста, процитируйте W3C, * не MSDN *, для обсуждений стандартов XML.) Более подробно о вашем вопросе, 'unbounded' не может использоваться как значение' maxOccurs' на 'xs: element' под' xs: все 'вообще. Надеюсь это поможет. – kjhughes

+0

Спасибо, я понимаю, что вы говорите, элемент XS: вложен внутри xs: all. и ошибка находится на элементе xs:. используя xs; последовательность позаботится об этой проблеме, но элементы могут появиться в любом порядке (именно поэтому я использую xs: all). Я понимаю, что maxOccurs нельзя использовать в xs: element под xs: all (причина для этого сообщения в первую очередь). Я искал альтернативу. Я мог бы использовать xs: choice и создать элемент вместо ссылки на существующий (не идеально, поскольку ссылка используется несколькими точками). Я пытаюсь выяснить, есть ли способ использовать ссылку на элемент с xs: choice – james31rock

2

Ограничение на maxOccurs = "1" на xs: все удалено в XSD 1.1. У вас есть возможность использовать процессор XSD 1.1? Насколько мне известно, в настоящее время три человека: Саксон, Ксерц и Альтова.

+0

Спасибо, Майкл. Я изучаю это. – james31rock

Смежные вопросы