Почему этот keyRef не работает с xml - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь сослаться на ключ 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.

1 Ответ

0 голосов
/ 10 апреля 2020

Правила, когда xs:key и xs:keyRef имеют различную область видимости (то есть, когда они определены на разных элементах), чрезвычайно сложны - хотя я реализовал spe c, у меня все еще есть большие трудности с их. И я видел очень мало случаев, когда это действительно необходимо.

Я не могу сказать вам, что вы сделали неправильно, не увидев полную информацию о том, что вы на самом деле сделали; и я не могу сказать вам, как это исправить, не видя, какое ограничение вы на самом деле пытаетесь навязать. Но почти во всех случаях xs: key и соответствующий xs: keyref должны быть определены в одном и том же объявлении элемента.

В частности, если правило имеет форму "внутри A, каждое значение X должно ссылаться на до значения Y, которое существует ровно один раз в пределах A ", то ключ и keyref должны быть оба определены в объявлении элемента для A.

UPDATE

Обновление Теперь, когда вы показали нам свою схему.

Во-первых, ограничение <xs:unique> явно неверно. Когда вы пишете

<xsd:element name="t" type="xsd:string">
  <xsd:unique name="artistTagsTUnique">
                 <xsd:selector xpath="."/>  <!-- Element in t lists should be unique locally -->
                 <xsd:field xpath="."/>
             </xsd:unique>
</xsd:element>

Вы на самом деле говорите: «Внутри at, каждый. Должен иметь уникальное значение для.». Но t - это строка, она не имеет нескольких содержащихся элементов, которые должны быть уникальными в экземпляре t. Я подозреваю, что вы хотите, чтобы t был уникальным в пределах tags, и в этом случае ограничение применяется к элементу tags, и оно должно быть

<xsd:element name="tags" type="xsd:string">
  ...
  <xsd:unique name="artistTagsTUnique">
      <xsd:selector xpath="t"/>  
      <xsd:field xpath="."/>
  </xsd:unique>
</xsd:element>

Теперь с tagKey/tagRef У меня больше проблем с работой из того, что вы пытаетесь достичь (обратный инжиниринг требований из неправильного кода никогда не был моей сильной стороной). Вы использовали селектор parent/tag, но я нигде не вижу элемента с именем parent. Возможно, вы хотели parent::tag, но, конечно, вам не позволили подобрать вверх. Кажется, вы пытаетесь сказать, что значением элемента t должен быть тег (ключевое слово), который определен где-то еще в документе, но у меня возникают проблемы с поиском, где это "где-то еще".

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