Ограниченное правило XSD - PullRequest
1 голос
/ 15 декабря 2011

Есть способ создать правило, например, «ограничение внешнего ключа» в xsd? Мне нужно проверить наличие значения атрибута, равного атрибуту «использования» узла.

<node use="..." />
<otherNode name="..." />

См. Пример выше, атрибут установлен в «узел», атрибут «использовать», значение этого атрибута должно быть равно «otherNode» в атрибуте «имя»

1 Ответ

1 голос
/ 15 декабря 2011

Установите тип атрибута использования в xs: IDREF

и атрибут name к xs: ID.

Существует также тип xs: IDREFS.

Пример

<xsd:element name="quote">
  <xsd:complexType>
    <!--content model-->
    <xsd:attribute name="ref" type="xsd:IDREF"/>
  </xsd:complexType>
</xsd:element>
<xsd:element name="footnote">
  <xsd:complexType>
   <!--content model-->
   <xsd:attribute name="id" type="xsd:ID" use="required"/>
 </xsd:complexType>

...

Придает

<quote ref="fn1">...</quote>
<footnote id="fn1">...</footnote>

Таким образом, в кавычке должен быть параметр ref, который в этом случае указывает на сноску

Хм, может показаться, что выше было для DTD и не работает, однако я нашел это

Истинное представление ключа

Если вы когда-либо пытались описать реляционную базу данных со сложной картой отношений, используя DTD, вам, вероятно, пришлось использовать механизм указания ID-IDREF. Например, в структуре, в которой две сущности связаны многими во многих отношениях посредством связанной таблицы (например, заемщики и активы в приложении ссуды), простого отношения XML родитель-потомок недостаточно. Однако идентификаторы и идентификаторы IDREF имеют свои недостатки: идентификаторы должны быть уникальными для всего документа, а объявления IDREF не указывают тип элемента, на который должен ссылаться экземпляр атрибута IDREF. Схема XML обеспечивает способ задания этих указательных отношений во многом так же, как отношения внешних ключей объявляются в реляционной базе данных. Например, скажем, у вас есть отношение внешнего ключа, которое вы не можете выразить с помощью простых отношений родитель-потомок в нашем XML. Вы можете объявить два связанных элемента, как показано в листинге 3:

<xsd:element name="rootElement">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="elementOne" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:attribute name="elementOneKey" type="integer" />
          <xsd:attribute name="elementOneDesc" type="text" />
        </xsd:complexType>
        <xsd:key name="elementOnePK">
          <xsd:selector xpath=".//elementOne"/>
          <xsd:field xpath="@elementOneKey"/>
        </xsd:key>
      </xsd:element>
      <xsd:element name="elementTwo" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:attribute name="elementTwoKey" type="integer" />
          <xsd:attribute name="elementOneKey" type="integer" />
          <xsd:attribute name="elementTwoDesc" type="text" />
        </xsd:complexType>
        <xsd:keyref name="elementOneFK" refer="elementOnePK">
          <xsd:selector xpath=".//elementTwo"/>
          <xsd:field xpath="@elementOneKey"/>
        </xsd:keyref>
      </xsd:element>
     </xsd:sequence>
   </xsd:complexType>
</xsd:element>

Что еще лучше, поскольку вы можете правильно связать идентификатор и ссылку.

Плюс, я учусь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...