Я пытаюсь сослаться на ключ xsd с помощью refkey, но получаю сообщение об ошибке. Я ничего не могу сделать.
При сравнении с xml здесь Я получаю это сообщение для всех строк, где я использую t
элемент
Error - Line 14, 36: org.xml.sax.SAXParseException; lineNumber: 14; columnNumber: 36; Identity Constraint error: identity constraint "KeyRef@267613e6" has a keyref which refers to a key or unique that is out of scope.
(Они @NUMBER) изменяет случайные другие числа всякий раз, когда я проверяю его целиком. Кроме того, оба документа хорошо сформированы и действительны сами по себе.
Я думал, что мог допустить ошибку с ключом, но не будет ли это ошибкой с ключом? Также с помощью keyref я хочу указать элемент t
. Я пробовал self
и .
, какой из них мне следует использовать?
Это ключ, который я поместил в art/artistsTagType/t
. Где art - элемент root, а artistTagType - complexType, содержащий элемент t. (Используется несколько раз)
<xsd:keyref name="tagRef" refer="tagKey">
<xsd:selector xpath="?"/>
<xsd:field xpath="?"/>
</xsd:keyref>
TagKey, на который я пытаюсь ссылаться, находится в art/objects/object/tags
, где все они являются элементами.
<xsd:key name="objKey">
<xsd:selector xpath="art/objects/object"/>
<xsd:field xpath="@title"/>
<xsd:field xpath="@catalog"/>
</xsd:key>
Моя проблема, вероятно, очень тривиальна, но Я новичок в xsd и xml и ничего не могу с этим поделать, любая помощь очень ценится.
РЕДАКТИРОВАТЬ:
Это (сокращенный) документ xsd, который я использую.
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="art">
<xsd:complexType>
<xsd:all>
<xsd:element name="artists">
<xsd:complexType>
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element name="artist">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="lived">
<xsd:complexType>
<xsd:attribute name="from" type="xsd:date" use="required"/>
<xsd:attribute name="to" type="xsd:date"/>
<xsd:attribute name="birthplace" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="tags" type="artistTagsType"/><!-- Use one -->
</xsd:sequence>
<xsd:attribute name="aid" type="xsd:ID" use="required"/>
</xsd:complexType>
<xsd:key name="artistKey">
<xsd:selector xpath="art/artists/artist"/>
<xsd:field xpath="@aid"/>
</xsd:key>
<xsd:keyref name="artistRef" refer="artistKey">
<xsd:selector xpath="art/objects/object/label/year/ref"/>
<xsd:field xpath="@aid"/>
</xsd:keyref>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="objects">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="object" minOccurs="3" maxOccurs="unbounded"> <!--maxOccures default is 1-->
<xsd:complexType>
<xsd:all>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="catalog">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="([A-Z]{2})-([0-9]{3})-([a-z][0-4])"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="tags" type="artistTagsType" minOccurs="0" /><!-- Use two-->
</xsd:all>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:key name="objKey">
<xsd:selector xpath="art/objects/object"/>
<xsd:field xpath="@title"/>
<xsd:field xpath="@catalog"/>
</xsd:key>
</xsd:element>
<xsd:element name="tags">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="tag" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="tagname" type="xsd:string"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:key name="tagKey"> <!-- The key-->
<xsd:selector xpath="parent/tag"/>
<xsd:field xpath="@tagname"/>
</xsd:key>
</xsd:element>
</xsd:all>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="artistTagsType">
<xsd:sequence>
<xsd:element name="t" type="xsd:string" maxOccurs="3" minOccurs="0">
<xsd:unique name="artistTagsTUnique">
<xsd:selector xpath="."/> <!-- Element in t lists should be unique locally -->
<xsd:field xpath="."/>
</xsd:unique>
<xsd:keyref name="tagRef" refer="tagKey"><!-- Key Ref-->
<xsd:selector xpath="."/>
<xsd:field xpath="."/>
</xsd:keyref>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Ключ принадлежит элементу tags в схеме it, в объектах и элементах исполнителей. Я использую элементы t, которые на него ссылаются.
EDIT 2: Таким образом, уникальное ограничение должен быть локальным.
<tags>
<t>David</t>
<t>The Pity</t>
</tags>
....
<tags>
<t>Alaskan Waterfall</t>
<t>David</t>
</tags>
Это должно быть возможно, в то время как
<tags>
<t>David</t>
<t>David</t>
</tags>
должно быть запрещено. И поскольку я использую тип t
в различных элементах tags
, я хотел объявить уникальность в t
. (Один находится внутри элемента object, а другой - в элементе Artist
Для ключа: документ должен содержать список тегов, использующих tagKey
. Теперь оба артиста и объекты имеют элемент tags
(необязательно для объектов), содержащих несколько элементов t
, где содержимое указанных элементов t
должно ссылаться на tagKey
.