2013-04-21 66 views
1

我在定義XML模式中的密鑰時遇到問題。XML/XSD如何創建密鑰

CODE:

XSD:

<xsd:element name="players"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="player" minOccurs="0" maxOccurs="unbounded"> 
       <xsd:complexType> 
        <xsd:all> 
         <xsd:element name="date-of-birth" type="xsd:date"></xsd:element> 
         <xsd:element name="gender"> 
          <xsd:simpleType> 
           <xsd:restriction base="xsd:string"> 
            <xsd:enumeration value="MALE" /> 
            <xsd:enumeration value="FEMALE" /> 
           </xsd:restriction> 
          </xsd:simpleType> 
         </xsd:element> 
        </xsd:all> 
        <xsd:attribute name="username" type="xsd:string" use="required" /> 
       </xsd:complexType> 
       <xsd:key name="playerkey"> 
        <xsd:selector xpath="players/player" /> 
        <xsd:field xpath="username" /> 
       </xsd:key> 
      </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

注意,這僅僅是從全碼的exzerpt,但它顯示了所有必要的信息。

XML

<t:players> 
    <t:player username="Super Mario"> 
     <t:gender>FEMALE</t:gender> 
     <t:date-of-birth>1995-11-29</t:date-of-birth> 
    </t:player> 
    <t:player username="Super Mario"> 
     <t:date-of-birth>1991-10-12</t:date-of-birth> 
     <t:gender>MALE</t:gender> 
    </t:player> 
</t:players> 

問題:

正如你可以看到我已經創建了兩個球員都命名爲 「超級馬里奧」。由於關鍵的應該是唯一的這應該拋出和錯誤,但xmllins確實驗證文件正確

問題:

我如何正確定義密鑰,該元素是必要的,是唯一的。

回答

2
  1. 移動鍵聲明它適用的水平,在這種情況下,我想,你希望每個玩家<>是所有<球員中唯一>
  2. 的XPath表達式是錯誤的架構中的;用戶名是一個屬性,並且必須有一個@前綴。
  3. 如果通過鍵選擇的元素具有非空名稱空間,則還必須使用這些nanespaces限定xapth表達式。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" targetNamespace="xyzzy" xmlns:t="xyzzy"> 
    <xsd:element name="players"> 
     <xsd:complexType> 
      ... 
    </xsd:complexType> 
    <xsd:key name="playerkey"> 
     <xsd:selector xpath="t:player" /> 
     <xsd:field xpath="@username" /> 
    </xsd:key> 
    </xsd:element> 
</xsd:schema> 

更新了命名空間的資格。

+0

Thanx爲你提供幫助,但遺憾的是它仍然沒有成功。 我將他們的鑰匙移入玩家並更改了xpath,但它仍然使用兩個非唯一元素正確驗證 – 2013-04-22 08:19:38

+0

好的,它必須是名稱空間。查看更新。 – 2013-04-22 09:10:58

+0

好的命名空間是問題:D 它現在的作品,感謝您的幫助隊友! :) – 2013-04-22 10:03:55

1

在XSD中,如果您希望某個元素R中的每個元素E都具有F的唯一值,則R的聲明需要包含一個鍵定義,其中選擇器從R中選擇E,並且該字段選擇F來自E.