2016-01-21 3 views
1

У меня есть следующие схе-Cant получить дочерние элементы набора atmost один раз в XSD

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

<xsd:element name="Type"> 
<xsd:complexType> 
<xsd:sequence> 
<xsd:choice minOccurs="0" maxOccurs="unbounded"> 
<xsd:element name="First"> 
<xsd:complexType> 
<xsd:choice minOccurs="0" maxOccurs="5"> 
     <xsd:element name="a" type="xsd:decimal" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name="b" type="xsd:int" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name="c" type="xsd:int" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name="d" type="xsd:int" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name="e" type="xsd:int" minOccurs="0" maxOccurs="1"/> 
</xsd:choice> 
</xsd:complexType> 
</xsd:element> 

<xsd:element name="Second" type="xsd:base64Binary"/> 
</xsd:choice> 
</xsd:sequence> 
</xsd:complexType> 
</xsd:element> 
</xsd:schema> 

Узор, который я хочу, чтобы создать то, что XML может содержать первые и вторые элементы любого количества раз и любой заказ но элемент First должен иметь дочерние элементы не чаще одного раза. то есть, a, b, c, d, e могут возникать не более одного раза. Я не могу достичь этой второй части, где дочерние элементы встречаются не чаще одного раза. Любые идеи почему?

ответ

2

Вместо xsd:choice используйте xsd:all, что позволяет элементам отображаться в любом порядке. С появлением граней ниже каждого дочернего элемента может появляться один или несколько раз.

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <xsd:element name="Type"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:choice minOccurs="0" maxOccurs="unbounded"> 
        <xsd:element name="First"> 
         <xsd:complexType> 
          <xsd:all maxOccurs="1"> 
           <xsd:element name="a" type="xsd:decimal" minOccurs="0" /> 
           <xsd:element name="b" type="xsd:int" minOccurs="0"/> 
           <xsd:element name="c" type="xsd:int" minOccurs="0"/> 
           <xsd:element name="d" type="xsd:int" minOccurs="0"/> 
           <xsd:element name="e" type="xsd:int" minOccurs="0"/> 
          </xsd:all> 
         </xsd:complexType> 
        </xsd:element> 

        <xsd:element name="Second" type="xsd:base64Binary"/> 
       </xsd:choice> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

Проверка против этой схемы, документ, как

<?xml version="1.0" encoding="UTF-8"?> 
<Type xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="Untitled7.xsd"> 
    <First> 
     <b>10</b> 
     <a>10.0</a> 
     <c>3</c> 
     <d>4</d> 
     <e>5</e> 
    </First> 
    <Second></Second> 
</Type> 

действительно, в то время как следующий не будет:

<?xml version="1.0" encoding="UTF-8"?> 
<Type xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="Untitled7.xsd"> 
    <First> 
     <b>10</b> 
     <a>10.0</a> 
     <c>3</c> 
     <d>4</d> 
     <e>5</e> 
     <a>10.0</a> 
    </First> 
    <Second></Second> 
</Type> 

потому что a появляется дважды в одном First элемента.

+0

@raghav Пожалуйста, не оставляйте комментарии в комментариях - это нечитаемо. И я не понимаю вашего комментария. Что ты пытаешься мне сказать? Просто попробуйте использовать схему, которую я предложил. –

+0

Я попробую. Благодарю. Я хочу добавить, что я могу сгенерировать «недействительный» XML, отправленный вами с моей исходной схемой. Разве не встречаются грани, работающие с дочерними элементами? – raghav

+0

Muller // С графами возникновения под каждым дочерним элементом может появляться либо один раз, либо нет. Это требование. Поэтому я написал «не один раз». Почему фасет возникновения не работает с дочерними элементами? – raghav

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