XSD - я испытываю странное поведение при использовании абстрактного механизма с группой подстановки из других пространств имен - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть следующий spml-example.xsd, который определяет элемент команды, который содержит элемент действия:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.myexample.com/command" xmlns:tns="http://www.myexample.com/command"
    elementFormDefault="qualified">

    <xs:element name="Action" type="tns:ActionType" abstract="true" />

    <xs:complexType name="ActionType" abstract="true">
        <xs:attribute name="result" type="xs:string" />
    </xs:complexType>

    <xs:element name="Command">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="tns:Action" minOccurs="1" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

Как видите, действие является абстрактным, поэтому его заменяет конкретная реализация. Итак, у меня есть два типа действий, которые расширяют это действие:
Первым является spml-test-actions.xsd, который определяет действие чтения:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.myexample.com/actions/data"
    xmlns:tns="http://www.myexample.com/actions/data" xmlns:command="http://www.myexample.com/command"
    elementFormDefault="qualified">
    <xs:import namespace="http://www.myexample.com/command"
        schemaLocation="../../spml-example.xsd" />

    <xs:element name="read" type="tns:readType"
        substitutionGroup="command:Action" />

    <xs:complexType name="readType">
        <xs:complexContent>
            <xs:extension base="command:ActionType">
                <xs:attribute name="a" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

</xs:schema>

вторым является spml-local-actions.xsd, который определяет всплывающее действие:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.myexample.com/actions/local"
    xmlns:tns="http://www.myexample.com/actions/local" xmlns:command="http://www.myexample.com/command"
    elementFormDefault="qualified">
    <xs:import namespace="http://www.myexample.com/command"
        schemaLocation="../../spml-example.xsd" />

    <xs:element name="popup" type="tns:PopupType"
        substitutionGroup="command:Action" />

        <xs:complexType name="PopupType">
        <xs:complexContent>
            <xs:extension base="command:ActionType" >
                <xs:attribute name="width" type="xs:float"/> 
                <xs:attribute name="height" type="xs:float"/>
                <xs:attribute name="view" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>

обратите внимание, что эти действия находятся в разных пространствах имен .

Теперь я создал следующий экземпляр xml, и он прекрасно работает:

<?xml version="1.0" encoding="UTF-8"?>
<Command xmlns="http://www.myexample.com/command" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:crud="http://www.myexample.com/actions/data"
    xmlns:local="http://www.myexample.com/actions/local"
    xsi:schemaLocation="http://www.myexample.com/command spml-example.xsd 
    http://www.myexample.com/actions/data actions/data/spml-test-actions.xsd 
    http://www.myexample.com/actions/local actions/local/spml-local-actions.xsd">
    <local:popup/>
</Command>

но здесь есть странность, теперь, если я добавлю действие crud: read, оно завершится неудачно с сообщением "cvc-complex-type.2.4.a: найден недопустимый контент, начиная с элемента 'crud: read'. Один из '{"http: // www.myexample.com/command":Action} «ожидается»

Это не означает, что crud: read не в порядке, потому что если сейчас я удалю всплывающее действие local:, xml снова будет действительным, то есть разрешено добавлять только действие из одного пространства имен.

У меня есть решение для этого, которое по конструкции не является правильным, я могу добавить в spml-example.xsd импорт spml-test-actions.xsd и spml-local-actions.xsd.

помогите пожалуйста, спасибо.

Ответы [ 3 ]

1 голос
/ 02 марта 2012

Я нашел проблему, как это было сказано выше.просто нужно перейти в eclipse к окну -> предпочтения, а затем в предпочтении проверки XML убрать галочку «соблюдать все положения схемы XML».см. ошибку - Редактор XML не может проверить элемент substitutionGroup

0 голосов
/ 01 марта 2012

Я думаю, что в вашем вопросе отсутствует то, как вы проверяете XML; в отличие от Майкла, я думаю, что ваша проблема не имеет ничего общего с вашим процессором схемы, а скорее с тем, как вы проверяете свой XML.

Если ваш редактор XML или любой другой используемый вами API использует подсказки xsi: schemaLocation, то очевидно, что происходит только то, что он загружает только первый файл схемы XML. Вы можете легко поиграть, удалив http://www.myexample.com/command spml-example.xsd из подсказки schemaLocation; Я предполагаю, что тогда произойдет, члены вашей группы замещения из вашего первого списка XSD и из импортированных будут работать нормально; все после не будет.

Если вы действительно видите в этом виновника, то, что вы можете сделать, чтобы обойти это - если вы хотите придерживаться подсказки schemaLocation - это создать XSD, который импортирует ваши raw и локальные XSD (забудьте о spml-example.xsd ) и используйте этот XSD в качестве подсказки.

В противном случае, чтобы получить разумный совет, вам нужно описать больше того, как вы проводите проверку (я полагаю, из сообщения об ошибке на основе Java, скорее всего, Xerces).

0 голосов
/ 29 февраля 2012

Это работает для меня (используя Saxon-EE 9.4 в качестве процессора схемы).Это может быть ошибка в вашем процессоре схемы или что-то, что связано с его настройкой.

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