Привязать атрибут к другому существующему атрибуту - PullRequest
1 голос
/ 28 марта 2012

Я хочу создать XSD.Один необязательный элемент в XSD - <PrintoutSettings OrderSource="NameOfOrder_X" .../>

Другая подструктура XSD -

<Order Name="NameOfOrder">...</Order>
<Order Name="NameOfOrder2">...</Order>
...

Моя цель состоит в том, чтобы атрибут NameOfOrder_X из <PrintoutSettings .../> был строкойэто было определено в одном из <Order>...</Order> - элементов.

Как я могу реализовать это в XSD?

С уважением, sb

---

---


Вот некоторые из моих XSD:

<xs:complexType name="Order">
    <xs:sequence>
        <xs:element form="qualified" minOccurs="0" name="Documents" type="Documents"/>
    </xs:sequence>
    <xs:attribute name="Name" type="xs:string" use="required"/>
    <xs:attribute name="Translator" type="xs:string" use="required"/>
    <xs:attribute name="Proofreader" type="xs:string" use="required"/>
    <xs:attribute name="LockedBy" type="xs:string" use="optional"/>
</xs:complexType>


<xs:complexType name="Orders">
    <xs:sequence>
        <xs:element maxOccurs="unbounded" name="Order" type="Order"/>
    </xs:sequence>
</xs:complexType>
<xs:complexType name="QQDBData">
    <xs:sequence>
        <xs:element minOccurs="0" name="Orders" type="Orders"/>
        <xs:element minOccurs="0" name="LocalSettings" type="Settings"/>
    </xs:sequence>
    <xs:attribute default="2000-01-01" name="CreationDate" type="xs:date" use="optional"/>
</xs:complexType>

<xs:element name="QQDBData" type="QQDBData">
    <xs:key name="PK-Orders">
        <xs:selector xpath="Order"/>
        <xs:field xpath="@Name"/>
    </xs:key>
    <xs:keyref name="FK-PrintoutSettings" refer="PK-Orders">
        <xs:selector xpath="PrintoutSettings"/>
        <xs:field xpath="@OrderSource"/>
    </xs:keyref>
</xs:element>

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

Ответ, который вы получили от @DevNull, технически правильный (+1);это, однако, не так много XSD;взгляните на этот раздел из учебника по схемам, чтобы понять ограничения, которые у вас есть с ID / IDREF.

Я возьму схему, предложенную DevNull, и изменю ее, чтобы показать вамрекомендованный подход XSD, основанный на key / keyref.

ОБНОВЛЕНИЕ: Я взял вашу схему и обновил ее, чтобы убедиться, что она достаточна для моих тестов:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:complexType name="Order">
        <xs:sequence>
            <xs:element form="qualified" minOccurs="0" name="Documents" type="Documents"/>
        </xs:sequence>
        <xs:attribute name="Name" type="xs:string" use="required"/>
        <xs:attribute name="Translator" type="xs:string" use="required"/>
        <xs:attribute name="Proofreader" type="xs:string" use="required"/>
        <xs:attribute name="LockedBy" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="Documents"/>
    <xs:complexType name="Orders">
        <xs:sequence>
            <xs:element maxOccurs="unbounded" name="Order" type="Order"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="QQDBData">
        <xs:sequence>
            <xs:element minOccurs="0" name="Orders" type="Orders"/>
            <xs:element minOccurs="0" name="LocalSettings" type="Settings"/>
        </xs:sequence>
        <xs:attribute default="2000-01-01" name="CreationDate" type="xs:date" use="optional"/>
    </xs:complexType>
    <xs:complexType name="Settings">
        <xs:attribute name="OrderSource" use="required" type="xs:string"/>
    </xs:complexType>
    <xs:element name="QQDBData" type="QQDBData">
        <xs:key name="PK-Orders">
            <xs:selector xpath="Orders/Order"/>
            <xs:field xpath="@Name"/>
        </xs:key>
        <xs:keyref name="FK-PrintoutSettings" refer="PK-Orders">
            <xs:selector xpath="LocalSettings"/>
            <xs:field xpath="@OrderSource"/>
        </xs:keyref>
    </xs:element>
</xs:schema> 

Что мне нужно было сделать, так этообновите селекторы, поскольку путем введения дополнительных тегов XPath изменился.Я всегда стараюсь визуализировать ограничения, чтобы гарантировать, что описанные XPath по-прежнему имеют смысл.

Key-KeyRef

Обновленный образец XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<QQDBData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" CreationDate="2000-01-01">
    <Orders>
        <Order Name="Name1" Translator="Translator1" Proofreader="Proofreader1" LockedBy="LockedBy1">
            <Documents/>
        </Order>
        <Order Name="Name1" Translator="Translator1" Proofreader="Proofreader1" LockedBy="LockedBy1">
            <Documents/>
        </Order>
    </Orders>
    <LocalSettings OrderSource="OrderSource1"/>
</QQDBData>

Ошибкасообщение, для того же недопустимого XML может выглядеть (я использую QTAssistant для проверки):

Error occurred while loading [], line 12 position 3 The key sequence 'OrderSource1' in Keyref fails to refer to some key.

2 голосов
/ 28 марта 2012

Вы можете использовать тип атрибута xs:ID для <Order> и тип атрибута xs:IDREF для <PrintoutSettings>.

Пример XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="doc">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="Order"/>
        <xs:element ref="PrintoutSettings"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Order">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:NMTOKEN">
          <xs:attribute name="Name" use="required" type="xs:ID"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="PrintoutSettings">
    <xs:complexType>
      <xs:attribute name="OrderSource" use="required" type="xs:IDREF"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

Пример недействительного XML: (выдает ошибку "Нет привязки ID / IDREF для IDREF 'NameOfOrder_X'." В Xerces.)

<doc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="book.xsd">
  <Order Name="NameOfOrder">...</Order>
  <Order Name="NameOfOrder2">...</Order>
  <PrintoutSettings OrderSource="NameOfOrder_X"/>
</doc>

Пример допустимого XML:

<doc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:noNamespaceSchemaLocation="book.xsd">
  <Order Name="NameOfOrder">...</Order>
  <Order Name="NameOfOrder2">...</Order>
  <PrintoutSettings OrderSource="NameOfOrder2"/>
</doc>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...