2012-03-26 10 views
7

Piszę niektóre XML i XSD jako zadanie ... W moim XML mam tag o nazwie a (nie rzeczywista nazwa) i atrybut o nazwie id. Część mojego XML przedstawiono poniżej:Jak zadeklarować identyfikator atrybutu w XML

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

Kiedy walidacji przy użyciu XSD nie daje błąd ....

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

Próbowałem użyć xsd: ID jako typ danych atrybut id ale dał mi błąd; Nie mogłem zrozumieć, na czym polega problem.

Jak mogę to zrobić?

+0

Więc nie pojawia się błąd, jeśli przypisać xsd, ale trzeba zrobić, jeśli nie przypisać jeden? – kjosh

Odpowiedz

14

powinien wrócić do przy użyciu type="xsd:ID". Oprócz upewnienia się, że wartość jest unikatowa, możliwe jest również użycie odwołania do xsd:IDREF.

Błąd, który pojawia się przy próbie użycia xsd:ID, polega na tym, że wartość identyfikatora musi zaczynać się od litery. Jeśli zmienisz swoje ID na "ID-1"/"ID-2" lub "a1"/"a2", będzie działało dobrze.

Przykład schematu:

<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> 

Przykład 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

Jak mogę dodać tekst do mojego xml, aby określić, że dla każdego elementu identyfikator atrybutu ma typ xsd: ID? Czy można umieścić tę deklarację wewnątrz samego dokumentu? – AndreaBogazzi

+0

[Ten (nieco przestarzały) artykuł] (http://www.xml.com/pub/a/2002/11/20/schemas.html?page=3) omawia użycie 'key',' keyref', 'unique 'over 'ID' i' IDREF'. Jakieś komentarze na ten temat? – Jens

1

"1" jest prawidłowym łańcuchem, więc sprawdzanie poprawności nie zwraca błędu. Jeśli chcesz określić pewne ograniczenia (np „id powinien rozpoczyna się od litery”), trzeba zadeklarować swój typ i określić wzór:

<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"/> 
.... 

Jeśli chcesz określić unikatowości ograniczenie, można użyć XSD: unikalnym elementem tak:

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

to będzie oznaczać, że element ten „korzeń” deklarowany jako pewnego „myList” powinien zawierać elementy podrzędne „a” z unikalnych atrybutów „id”

+0

Chcę mieć atrybut id dla każdego elementu i upewnić się, że każda wartość id jest unikalna. – Zeemaan

+0

Właśnie dodałem komentarz na temat xsd: unikalna funkcja. To ci pomoże. –

Powiązane problemy