Как объявить идентификатор атрибута в XML - PullRequest
8 голосов
/ 26 марта 2012

Я пишу некоторые XML и XSD в качестве задания ... В моем XML у меня есть тег с именем a (не фактическое имя) и атрибут с именем id. Часть моего XML показана ниже:

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

Когда я проверяю, используя XSD, это не выдает ошибку ....

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

Я пытался использовать xsd: ID в качестве типа данных атрибута id, но он выдал ошибку; Я не мог понять, в чем проблема.

Как я могу это сделать?

Ответы [ 2 ]

15 голосов
/ 26 марта 2012

Вы должны вернуться к использованию type="xsd:ID".В дополнение к тому, что это значение уникально, оно позволяет вам использовать xsd:IDREF для ссылок.

Ошибка, возникающая при попытке использовать xsd: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>
1 голос
/ 26 марта 2012

«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: unique, например:

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

Это будет означать, что элемент «root», объявленный как «myList», должен содержать подэлементы «a» с уникальными атрибутами «id»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...