2012-03-26 91 views
7

我正在寫一些XML和一個XSD作爲一項任務... 在我的XML中,我有一個名爲a(不是實際名稱)的標籤和名爲id的屬性。我的XML的一部分如下所示:如何在XML中聲明一個屬性ID

<a id="1"> 
    ........... 
    </a> 
    <a id="1"> 
    ............ 
    </a> 

當我驗證使用XSD它不給出錯誤....

<xsd:attribute name="id" type="xsd:string" /> 

我試圖使用XSD:ID作爲一個數據類型屬性id但它給了我一個錯誤;我無法弄清楚問題所在。

我該怎麼做?

+0

因此,如果您指定的XSD你沒有得到一個錯誤,但是如果你不指定一個你怎麼辦? – kjosh 2012-03-26 17:48:16

回答

14

你應該回去使用type="xsd:ID"。除了確保值的唯一性之外,它還可以使您使用xsd:IDREF進行參考。

當您嘗試使用xsd:ID時出現的錯誤是ID值必須以字母開頭。如果您將您的ID更改爲「ID-1」/「ID-2」或「a1」/「a2」之類的東西,它就會正常工作。

示例模式:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xsd:element name="doc"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element maxOccurs="unbounded" ref="a"/> 
     <xsd:element maxOccurs="unbounded" ref="b"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
    <xsd:element name="a"> 
    <xsd:complexType> 
     <xsd:simpleContent> 
     <xsd:extension base="xsd:string"> 
      <xsd:attribute name="id" use="required" type="xsd:ID"/> 
     </xsd:extension> 
     </xsd:simpleContent> 
    </xsd:complexType> 
    </xsd:element> 
    <xsd:element name="b"> 
    <xsd:complexType> 
     <xsd:simpleContent> 
     <xsd:extension base="xsd:string"> 
      <xsd:attribute name="idref" use="required" type="xsd:IDREF"/> 
     </xsd:extension> 
     </xsd:simpleContent> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

示例XML:

<doc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="Untitled1.xsd"> 
    <a id="ID-1"> 
    ........... 
    </a> 
    <a id="ID-2"> 
    ............ 
    </a> 
    <b idref="ID-1"/> 
</doc> 
+0

如何添加一些文本到我的xml中,以指定每個元素的屬性id的類型爲xsd:ID? 是否有可能將此聲明嵌入到文檔本身中? – AndreaBogazzi 2014-07-24 16:21:49

+0

[本(有些過時)的文章](http://www.xml.com/pub/a/2002/11/20/schemas.html?page=3)討論了使用'key','keyref','獨特'通過'ID'和'IDREF'。對此有何評論? – Jens 2016-05-26 06:04:49

1

「1」是一個有效的字符串,所以驗證不會返回錯誤。 如果要指定一些限制(例如,「ID必須以字母開頭」),你必須聲明你的類型,並指定模式:如果要指定唯一性限制

<xsd:simpleType name="myID"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:pattern value="[a-zA-Z].*"/> 
    </xsd:restriction> 
</xsd:simpleType> 
.... 
    <xsd:attribute name="id" type="myID"/> 
.... 

,您可以使用在XSD:獨特的元素是這樣的:

<xsd:element name="root" type="myList"> 
    <xsd:unique name="myId"> 
    <xsd:selector xpath="./a"/> 
    <xsd:field xpath="@id"/> 
    </xsd:unique> 
</xsd:element> 

這將意味着元素的「根」,宣佈一些「myList中」應包含的子元素的「a」具有獨特屬性「ID」

+0

我想要的是爲每個元素的id屬性,並確保ID的每個值是唯一 – Zeemaan 2012-03-26 17:58:42

+0

我剛加入約XSD評論:獨特的功能。它會幫助你。 – 2012-03-26 18:06:52