2013-12-18 4 views
2

У меня есть эта схема XML, но я не знаю, как ее завершить, чтобы добиться того, что мне нужно. Я много раз искал информацию об уникальном использовании и использовании keyref, но все, что я могу найти, - это основные примеры.Как правильно использовать уникальный и keyref в XML-схеме?

Это моя схема:

<xs:element name="access" type="myaccess" /> 

    <xs:complexType name="myaccess"> 
     <xs:sequence> 
      <xs:element name="user" type="myuser" minOccurs="0" maxOccurs="unbounded"> 
       <xs:unique name="u_idunique"> 
        <xs:selector xpath="user" /> 
        <xs:field xpath="@id" /> 
       </xs:unique> 
      </xs:element> 
      <xs:element name="authorization" type="myauthorization" minOccurs="0" maxOccurs="unbounded"> 

      <!-- HERE I WANT A KEYREF TO id attribute of user element --> 
      <!-- HERE I WANT A KEYREF TO id attribute of building element OR door element --> 

      </xs:element> 
      <xs:element name="building" type="mybuilding" minOccurs="0" maxOccurs="unbounded" > 
       <!-- I DON'T KNOW HOW TO SPECIFY THAT id of building, id of door and id of gate are in the same scope --> 
       <xs:unique name="b_idunique"> 
        <xs:selector xpath="building" /> 
        <xs:field xpath="@id" /> 
       </xs:unique> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="myuser"> 
     <xs:attribute name="id" type="my_id" use="required" /> 
     <xs:attribute name="name" type="xs:string" use="required" /> 
     <xs:attribute name="phone" type="my_string_numeric" use="required" /> 
    </xs:complexType> 

    <xs:complexType name="mybuilding"> 
     <xs:sequence> 
      <xs:element name="door" type="mydoor" minOccurs="0" maxOccurs="unbounded"> 
       <!-- I DON'T KNOW HOW TO SPECIFY THAT id of building, id of door and id of gate are in the same scope --> 
       <xs:unique name="d_idunique"> 
        <xs:selector xpath="door" /> 
        <xs:field xpath="@id" /> 
       </xs:unique> 
      </xs:element> 
     </xs:sequence> 
     <xs:attribute name="id" type="my_id" use="required" /> 
     <xs:attribute name="name" type="xs:string" use="required" /> 
     <xs:attribute name="country" type="xs:string" use="required" /> 
    </xs:complexType> 

    <xs:complexType name="mydoor"> 
     <xs:sequence> 
      <xs:element name="gate" type="mygate" maxOccurs="unbounded"> 
       <!-- I DON'T KNOW HOW TO SPECIFY THAT id of building, id of door and id of gate are in the same scope --> 
       <xs:unique name="g_idunique"> 
        <xs:selector xpath="gate" /> 
        <xs:field xpath="@id" /> 
       </xs:unique> 
      </xs:element> 
     </xs:sequence> 
     <xs:attribute name="id" type="my_id" use="required" /> 
     <xs:attribute name="address" type="xs:string" use="required" /> 
     <xs:attribute name="status" type="mystatus" default="DISABLED" /> 
    </xs:complexType> 

    <xs:complexType name="mygate"> 
     <xs:attribute name="id" type="my_id" use="required" /> 
     <xs:attribute name="type" type="mytype" use="required" /> 
     <xs:attribute name="status" type="mystatus" default="DISABLED" /> 
    </xs:complexType> 

    <xs:complexType name="myauthorization"> 
     <xs:sequence> 
      <xs:element name="validityperiod" type="myvalidityperiod" /> 
     </xs:sequence> 
     <xs:attribute name="idu" type="my_id" use="required" /> 
     <xs:attribute name="idao" type="my_id" use="required" /> 
    </xs:complexType> 

    <!-- OMITTED USELESS PART OF THE SCHEMA --> 

</xs:schema> 

У меня есть две проблемы:

  • я не знаю, как определить, что поле идентификатора здания, поле идентификатора двери и ид поле ворот находится в том же объеме, и я не могу иметь 2 id равно (два здания не могут иметь один и тот же идентификатор, но также дверь и здание не могут использовать один и тот же идентификатор)
  • Я не знать, как правильно использовать элемент keyref.
    1. Я хотел бы, чтобы idu, зарегистрированный из элемента авторизации, является идентификатором, который присутствует в одном из элементов пользователя (см. [*] Ниже).
    2. Я хотел бы, чтобы поле авторизации Idao было идентификатором, который присутствует в одном из элементов здания или одном из элементов двери.

[*] Я пытался писать, но это не работает:

<xs:keyref name="useridkeyref" refer="u_idunique"> 
    <xs:selector xpath="authorization" /> 
    <xs:field xpath="@idu" /> 
</xs:keyref> 

Я знаю, что это не короткий вопрос, и я благодарю всех заранее для чтения. Надеюсь, я смогу помочь. Спасибо!

ответ

2

Уникальные ограничения и ключи ограничены уровнем element - вам нужно установить ограничение не внутри каждого отдельного элемента, а внутри элемента access, который является общим предком всех их.

<xs:element name="access" type="myaccess"> 
    <xs:key name="user_id"> 
    <xs:selector xpath="user" /> 
    <xs:field xpath="@id" /> 
    </xs:key> 
    <xs:key name="access_id"> 
    <xs:selector xpath="building | building/door | building/door/gate" /> 
    <xs:field xpath="@id" /> 
    </xs:key> 
    <xs:keyref name="user_ref" refer="user_id"> 
    <xs:selector xpath="authorization" /> 
    <xs:field xpath="@idu" /> 
    </xs:keyref> 
    <xs:keyref name="access_ref" refer="access_id"> 
    <xs:selector xpath="authorization" /> 
    <xs:field xpath="@idao" /> 
    </xs:keyref> 
</xs:element> 
+0

Благодарим за ответ! Это очень помогло мне! Но все еще есть проблема: когда я проверяю XML на схему, я получаю эту ошибку: «Ключ« access_ref »со значением« B4D1 »не найден для ограничения идентификации элемента« access ».» Все разрешения, относящиеся к зданию, в порядке, но те, которые относятся к двери, не работают, и я не могу понять, почему. –

+0

Это часть XML, которая дает мне ошибку:

+0

Хорошо, я решил, что решил сам: порядок путей в селекторе xpath для access_id важен, я исправил его до < xs: селектор xpath = "здание/дверь/ворота | здание/дверь | здание» /> Благодарим вас за полезный ответ! –