Не найдено ссылочного значения для keyRef с использованием XML-схемы xs: key и xs: keyref - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь добавить ограничения в мою схему XML-схемы, но у меня есть ошибка, которую я наблюдаю. Я продолжаю получать:

  1. Не найдено ссылочное значение для keyRef {author}: 2
  2. Не найдено ссылочное значение для keyRef {author}: 3

Я не знаю, что я делаю не так. Мой keyref, видимо, работает нормально, но ключ - нет. Как мне это исправить?

Это схема:

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

        <xs:element name="root">        
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="articles">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="article" type="article" maxOccurs="unbounded">
                                    <xs:keyref name="author" refer="authorKey">
                                        <xs:selector xpath="author"/>
                                        <xs:field xpath="@ref-number"/>
                                    </xs:keyref>
                                    <xs:unique name="unique-author">
                                        <xs:selector xpath="author"/>
                                        <xs:field xpath="@ref-number"/>
                                    </xs:unique>
                                  </xs:element>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                    <xs:element name="authors" type="authors" />
                </xs:sequence>  
            </xs:complexType>   
        </xs:element>

        <xs:complexType name="article">
            <xs:sequence>
                <xs:element name="author" maxOccurs="unbounded" minOccurs="1">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:string">
                                <xs:attribute name="ref-number" type="xs:integer" use="required" />
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>     
            </xs:sequence>
        </xs:complexType>

        <xs:complexType name="authors">
            <xs:sequence>
                <xs:element name="author" type="author">
                    <xs:key name="authorKey">
                        <xs:selector xpath="."/>
                        <xs:field xpath="@key-number"/>
                    </xs:key>
                </xs:element>        
            </xs:sequence>    
        </xs:complexType>

         <xs:complexType name="author"> 
             <xs:attribute name="key-number" type="xs:integer" use="required" />
         </xs:complexType> 

    </xs:schema>

Вот пример XML-файла, который нельзя проверить:

    <?xml version="1.0" encoding="UTF-8"?>
    <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="m5-schema.xsd">
        <articles>
            <article>
                <author ref-number="2"></author>
                <author ref-number="3"></author>     
            </article>
        </articles>
        <authors>
            <author key-number="2">
            </author>
        </authors>
    </root>

1 Ответ

0 голосов
/ 04 ноября 2018

Кажется, это проблема области видимости, поэтому помогла перенести ключевые ограничения в root и определить именованный тип для root:

<xs:element name="root" type="root">  
    <xs:keyref name="author" refer="authorKey">
        <xs:selector xpath=".//article/author"/>
        <xs:field xpath="@ref-number"/>
    </xs:keyref>
    <xs:unique name="unique-author">
        <xs:selector xpath=".//authors/author"/>
        <xs:field xpath="@ref-number"/>
    </xs:unique>
</xs:element>

<xs:complexType name="root">
    <xs:sequence>
        <xs:element name="articles">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="article" type="article" maxOccurs="unbounded">
                      </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:element name="authors" type="authors" />
    </xs:sequence>  
</xs:complexType> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...