"Элементы... не преобразуются в (n) определение типа" при проверке

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

Вот файл XSL:

<?xml version="1.0" encoding="ISO-8859-1"?>
<acknowledgement xmlns="http://sungardams.com/Validation.xsd" xmlns:common="http://sungardams.com/common.xsd">
    <type>POSITIVE</type> <!-- must have value POSITIVE -->
    <originReference>
        <externalMessageId>12345678-010</externalMessageId>
    </originReference>
    <requestMessageId>000000000000000000000000001</requestMessageId>
    <senderInfo>
        <common:messageId>000000000000000000000000000001</common:messageId>
        <common:externalMessageType>securityAddRequest</common:externalMessageType> <!-- must have value securityAddRequest -->
        <common:applicationHistory>
            <common:originatorReference>
                <common:originator>GLOBAL PLUS</common:originator> <!-- must have value GLOBAL PLUS -->
                <common:reference>ABCDE001</common:reference>
                <common:primaryReferenceType>GREF</common:primaryReferenceType> <!-- must have value GREF -->
            </common:originatorReference>
        </common:applicationHistory>
    </senderInfo>
</acknowledgement>

Файл, который я получаю, проверяется с использованием другого файла XSD и использует пространство имен common (объяснить, почему некоторые элементы имеют префикс common:).

Поэтому я создал следующие XSD-файлы:

Validation.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:common="http://sungardams.com/common.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://sungardams.com/common.xsd" schemaLocation="http://sungardams.com/common.xsd antCommon001.xsd"/>

    <xs:element name="acknowledgement">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="type" type="xs:string" fixed="POSITIVE" />
                <xs:element name="originReference">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="externalMessageId" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="requestMessageId" type="xs:string" />
                <xs:element name="senderInfo" type="CType_SenderInfo_ant" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

Во-первых, элемент senderInfo был определен в этом файле. Но когда я попытался сделать это таким образом, я получил бы сообщение об ошибке, что элементы недопустимы (я бы поставил перед именем имя с пространством имен common:, так что бы получить сообщение, что они не действительны xs:NCName).

Поэтому я переместил информацию об отправителе в другой файл: antCommon001.xsd

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

    <xs:element name="CType_SenderInfo_ant">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="messageId" type="xs:string" />
                <xs:element name="externalMessageType" type="xs:string" fixed="securityAddRequest" />
                <xs:element name="applicationHistory">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="originatorReference">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="originator" type="xs:string" fixed="GLOBAL PLUS" />
                                        <xs:element name="reference" type="xs:string" />
                                        <xs:element name="primaryReferenceType" type="xs:string" fixed="GREF" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

Теперь, когда я запускаю проверку XML-файла, я получаю сообщение (используя плагин проверки Notepad++ XML Tools):

Невозможно проанализировать файл схемы... элемент decl. 'senderInfo', атрибут 'type': значение QName 'CType_SenderInfo_ant' не преобразуется в (n) определение типа.

Что я делаю неправильно?

1 ответ

Решение

Вам нужно будет сделать несколько изменений, в том числе:

  • xs:import/@schemaLocation не должно быть пары namespace-XSDurl, как для xs:schema/@schemaLocation - это должен быть просто URL-адрес XSD.
  • Чтобы сослаться на тип в другом пространстве имен, добавьте к нему префикс пространства имен, объявленного этому пространству имен.
  • antCommon.XSD объявляет элемент, когда вы, кажется, хотите вместо этого ссылаться на тип.

В целом, с некоторыми дополнительными исправлениями, следующие обновления ваших файлов XML и XSD будут успешно проверять ваш XML:

validation.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<acknowledgement xmlns="http://sungardams.com/Validation.xsd" 
                 xmlns:common="http://sungardams.com/common.xsd"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://sungardams.com/Validation.xsd Validation.xsd">
  <type>POSITIVE</type> <!-- must have value POSITIVE -->
  <originReference>
    <externalMessageId>12345678-010</externalMessageId>
  </originReference>
  <requestMessageId>000000000000000000000000001</requestMessageId>
  <senderInfo>
    <common:messageId>000000000000000000000000000001</common:messageId>
    <common:externalMessageType>securityAddRequest</common:externalMessageType> <!-- must have value securityAddRequest -->
    <common:applicationHistory>
      <common:originatorReference>
        <common:originator>GLOBAL PLUS</common:originator> <!-- must have value GLOBAL PLUS -->
        <common:reference>ABCDE001</common:reference>
        <common:primaryReferenceType>GREF</common:primaryReferenceType> <!-- must have value GREF -->
      </common:originatorReference>
    </common:applicationHistory>
  </senderInfo>
</acknowledgement>

Validation.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:common="http://sungardams.com/common.xsd"
           targetNamespace="http://sungardams.com/Validation.xsd"
           elementFormDefault="qualified">
  <xs:import namespace="http://sungardams.com/common.xsd"
             schemaLocation="antCommon.xsd"/>

  <xs:element name="acknowledgement">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="type" type="xs:string" fixed="POSITIVE" />
        <xs:element name="originReference">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="externalMessageId" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="requestMessageId" type="xs:string" />
        <xs:element name="senderInfo" type="common:CType_SenderInfo_ant" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

antCommon.XSD

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://sungardams.com/common.xsd"
           elementFormDefault="qualified">

  <xs:complexType name="CType_SenderInfo_ant">
    <xs:sequence>
      <xs:element name="messageId" type="xs:string" />
      <xs:element name="externalMessageType" type="xs:string" 
                  fixed="securityAddRequest" />
      <xs:element name="applicationHistory">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="originatorReference">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="originator" type="xs:string"
                              fixed="GLOBAL PLUS" />
                  <xs:element name="reference" type="xs:string" />
                  <xs:element name="primaryReferenceType" 
                              type="xs:string" fixed="GREF" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

</xs:schema>
Другие вопросы по тегам