У меня есть эта схема 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.
- Я хотел бы, чтобы idu, зарегистрированный из элемента авторизации, является идентификатором, который присутствует в одном из элементов пользователя (см. [*] Ниже).
- Я хотел бы, чтобы поле авторизации Idao было идентификатором, который присутствует в одном из элементов здания или одном из элементов двери.
[*] Я пытался писать, но это не работает:
<xs:keyref name="useridkeyref" refer="u_idunique">
<xs:selector xpath="authorization" />
<xs:field xpath="@idu" />
</xs:keyref>
Я знаю, что это не короткий вопрос, и я благодарю всех заранее для чтения. Надеюсь, я смогу помочь. Спасибо!
Благодарим за ответ! Это очень помогло мне! Но все еще есть проблема: когда я проверяю XML на схему, я получаю эту ошибку: «Ключ« access_ref »со значением« B4D1 »не найден для ограничения идентификации элемента« access ».» Все разрешения, относящиеся к зданию, в порядке, но те, которые относятся к двери, не работают, и я не могу понять, почему. –
Это часть XML, которая дает мне ошибку: authorization> –
Хорошо, я решил, что решил сам: порядок путей в селекторе xpath для access_id важен, я исправил его до < xs: селектор xpath = "здание/дверь/ворота | здание/дверь | здание» /> Благодарим вас за полезный ответ! –