2014-02-17 51 views
0

我正在嘗試通過列id屬性創建具有行引用列的模式。下面的XML和XSD將不會驗證因爲該列無法找到在XML模式中使用ref

如何創建以下XML架構,這樣我可以從行元素引用的列ID:

<?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,並需要大於1(默認值)的maxOccurs

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

一旦予修正這些錯誤,它都驗證細,並交叉引用要求(即在一個row提到每列ID必須在columns部分對應於一個)由keykeyref照顧。

+0

但是我想用ref來強制它是對列的引用。這不是最新的嗎? – user3319681

+0

@ user3319681否,'ref'用於指向架構中其他位置的頂級'element'聲明。 'key'和'keyref'對是強制交叉引用約束的對象,並且這已經是正確的了。如果我將「124」引用中的一個更改爲「125」,則會導致驗證失敗。 –

+0

那麼你是否說,根據我的初衷,架構就像我擁有它(除了「ref」)是正確的方法嗎? – user3319681