2012-03-26 15 views
7

私はいくつかのXMLとXSDを割り当てとして書いています... 私のXMLにはa(実際の名前ではない)というタグとidという名前のタグがあります。私のXMLの一部を以下に示しますのデータタイプとしてID:XMLで属性IDを宣言する方法

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

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

私はそれがエラーを与えないXSDを使用して検証する....私はXSDを使用しようとしました属性idしかし、それは私にエラーを与えた。私は問題が何であるか把握できませんでした。

どうすればいいですか?

+0

ですから、XSDを割り当てる場合は、エラーを得ることはありませんが、あなたは1を割り当てない場合はありますか? – kjosh

答えて

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

+0

[この記事(多少日付がある)記事](http://www.xml.com/pub/a/2002/11/20/schemas.html?page=3)では、 'key'、' keyref'、 'unique 'ID'と' IDREF'の間にあります。それに関するコメント? – Jens

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」と宣言し、その要素の「ルート」はサブ要素を含まなければならない「」ユニークな属性を持つ「ID」を意味します

+0

私が望むのは、各要素のid属性を持ち、idの各値が一意であることを確認することです。 – Zeemaan

+0

xsd:unique featureについてのコメントを追加しました。それはあなたを助けるでしょう。 –

関連する問題