2014-02-17 4 views
0

Я пытаюсь создать схему с столбцами ссылок строк через атрибут id столбцов. Следующий XML и XSD не будет проверять, так как столбец не может быть найденИспользование ref в XML-схеме

Как создать схему для следующего XML, так что я могу ссылаться на столбец идентификатор из ряда элементов:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

    <rows> 
     <row> 
      <column id="123" /> 
      <column id="124" /> 
     </row> 
     <row> 
      <column id="123" /> 
      <column id="124" /> 
     </row> 
    </rows> 

    <columns> 
     <column id="123"> 
      <name>Apple</name> 
     </column> 

     <column id="124"> 
      <name>Banana</name> 
     </column> 
    </columns> 

</mapping> 

Мой XSD выглядит это, но это не работает ... не могу найти ссылку на столбец:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

<xsd:element name="mapping"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="rows" type="Rows" minOccurs="0" maxOccurs="1"/> 
      <xsd:element name="columns" type="Columns" minOccurs="0" maxOccurs="1"/> 
     </xsd:sequence> 
    </xsd:complexType>  
    <xsd:key name="PKeyColumn"> 
     <xsd:selector xpath="columns/column"/> 
     <xsd:field xpath="@id"/> 
    </xsd:key>  
    <xsd:keyref name="FKeyColumn" refer="PKeyColumn"> 
     <xsd:selector xpath="rows/row/column"/> 
     <xsd:field xpath="@id"/> 
    </xsd:keyref> 
</xsd:element> 

<xsd:complexType name="Row"> 
    <xsd:sequence> 
     <xsd:element ref="column"> 
      <xsd:complexType> 
       <xsd:attribute name="id" use="required" type="xsd:integer" /> 
      </xsd:complexType> 
     </xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="Rows"> 
    <xsd:sequence> 
     <xsd:element name="row" type="Row" minOccurs="1" maxOccurs="unbounded"> 
      <xsd:unique name="UKeyColumn"> 
       <xsd:selector xpath="column"/> 
       <xsd:field xpath="@id"/> 
      </xsd:unique> 
     </xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="Columns"> 
    <xsd:sequence> 
     <xsd:element name="column" type="Column" minOccurs="1" maxOccurs="unbounded"/> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="Column"> 
    <xsd:sequence> 
     <xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1"/> 
    </xsd:sequence> 
    <xsd:attribute name="id" type="xsd:integer" /> 
</xsd:complexType> 

</xsd:schema> 
+0

Можете ли вы показать схему, которую вы написали до сих пор? –

+0

Я добавил его к исходному вопросу – user3319681

ответ

0

Ваша схема имеет несколько незначительных проблем - в element ref="column" в потребностях типа быть name вместо ref, и требуется maxOccurs больше 1 (по умолчанию).

<xsd:complexType name="Row"> 
    <xsd:sequence> 
     <xsd:element name="column" maxOccurs="unbounded"> 

После того, как исправить эти ошибки, все это подтверждает хорошо, и требование перекрестных ссылок (т.е. каждый столбец ID упоминается в row должны соответствовать одному в разделе columns) удовлетворяются за по key и keyref ,

+0

Но я хочу использовать ref для обеспечения идеи, это ссылка на столбец. Разве это не для чего? – user3319681

+0

@ user3319681 no, 'ref' используется для указания на объявление верхнего уровня' element' из другого места в схеме. Пара 'key' и' keyref' - это то, что накладывает ограничение на перекрестные ссылки, и это уже правильно. Если я изменю одну из ссылок «124» на «125», я получаю отказ в валидации. –

+0

Вы говорите, что, учитывая мое первоначальное намерение, схема, как у меня есть (за исключением «ref»), является правильным подходом? – user3319681

Смежные вопросы