2015-11-21 6 views
1

Интересно, можно ли использовать элемент keyref с дополнительными полями.XML-схема: keyref с необязательным полем

например. Учитывая следующую схему:

<element name="myElement" type="myType"> 
    <complexType> 
     <sequence> 
      <element name="subElem"> 
       <complexType> 
        <attribute name="name" type="string"/> 
        <attribute name="type" type="string"/> 
       </complexType> 
      </element> 
      <element name="subElem2"> 
       <complexType> 
        <sequence> 
         <element name="subSubElem" minOccurs="0"> 
          <complexType> 
           <attribute name="type" type="string"/> 
          </complexType> 
         </element> 
        </sequence> 
        <attribute name="name" type="string" use="required"/> 
       </complexType> 
      </element> 
     </sequence> 
    </complexType> 
    <key name="uniqueSubElem"> 
     <selector xpath="subElem"/> 
     <field xpath="@name"/> 
     <field xpath="@type"/> 
    </key> 
    <keyref name="uniqueSubElemRef" refer="uniqueSubElem"> 
     <selector xpath="subElem2"/> 
     <field xpath="@name"/> 
     <field xpath="subSubElem/@type"/> 
    </keyref> 
</element> 

В этом примере, если я не указать subSubElem в XML валидатор будет жаловаться:

Not enough values specified for <keyref name="uniqueSubElem"> identity constraint specified for element "myElement". 

мне нужно как minOccurs="0" и KeyRef ограничение, и если поле отсутствует, просто не хотите, чтобы какая-либо проверка выполнялась (как для NULL FOREIGN KEYs).

EDIT: Игнорирование пространства имен для этого примера, я использовал пространство имен по умолчанию для всего ...

ответ

0

Я надеюсь, что я правильно понял вашу проблему. В вашей схеме, вам необходимо заключать <sequence> в <complexType>, и вам необходимо, чтобы закрыть поле, указывая на «subSubElem/@ тип»:

<xs:element name="myElement"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="subElem"> 
       <xs:complexType> 
        <xs:attribute name="name" type="xs:string"/> 
        <xs:attribute name="type" type="xs:string"/> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="subElem2"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="0" name="subSubElem"> 
          <xs:complexType> 
           <xs:attribute name="type" type="xs:string"/> 
          </xs:complexType> 
         </xs:element> 
        </xs:sequence> 
        <xs:attribute name="name" type="xs:string" use="required"/> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:key name="uniqueSubElem"> 
     <xs:selector xpath="subElem"/> 
     <xs:field xpath="@name"/> 
     <xs:field xpath="@type"/> 
    </xs:key> 
    <xs:keyref name="uniqueSubElemRef" refer="uniqueSubElem"> 
     <xs:selector xpath="subElem2"/> 
     <xs:field xpath="@name"/> 
     <xs:field xpath="subSubElem/@type"/> 
    </xs:keyref> 
</xs:element> 

Этот XML должен подтвердить без указания subSubElem:

<myElement> 
    <subElem name="foo" type="bar"/> 
    <subElem2 name="foo2"/> 
</myElement> 
+0

Я исправил схему. В любом случае, это подтверждается, потому что атрибут «имя» также отсутствует, но мне он нужен. Я добавил 'use =' required '' для атрибута name. – andrey

+0

Должен работать в любом случае, если вы добавите use = "required" в схему. Все еще не нужно указывать subSubElem. Я обновил решение. –

+0

Если есть проблемы, просто дайте нам пример XML, который вы ожидаете проверить. И, пожалуйста, в следующий раз включите все ваши требования в вопрос и не обновляйте свой вопрос так, чтобы ответы стали устаревшими. –