XML схема: проблемы пространства имен при импорте общих элементов

StackOverflow https://stackoverflow.com/questions/2637119

Вопрос

При попытке импортировать общие определения из XML-схемы, я могу правильно ссылаться на общие типы, но ссылки на общие элементы вызывают ошибки проверки.

Это схема, которая импортирует общие определения (example.xsd):

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

    <xs:import namespace="http://shared.com" schemaLocation="shared.xsd"/>

    <xs:element name="example">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="importedElement"/>
                <xs:element ref="importedType"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="importedElement">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="shared:fooElement"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="importedType">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="bar" type="shared:barType"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

Это общие определения (Shared.xsd):

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

    <xs:element name="fooElement">
        <xs:simpleType>
            <xs:restriction base="xs:integer"/>
        </xs:simpleType>
    </xs:element>

    <xs:simpleType name="barType">
        <xs:restriction base="xs:integer"/>
    </xs:simpleType>

</xs:schema>

Теперь рассмотрим этот экземпляр XML:

<?xml version="1.0"?>
<example
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                     
  xsi:noNamespaceSchemaLocation="example.xsd">
    <importedElement>
        <fooElement>42</fooElement>
    </importedElement>
    <importedType>
        <bar>42</bar>
    </importedType>
</example>

При подтверждении «ImportedType» работает отлично, но «ImportedEdElement» дает следующую ошибку:

Неверный контент был найден, начиная с элемента «Фуэлемент». Один из '{"http://shared.com.«: Фуэлемент}» ожидается

Я думаю, что мои проблемы связаны с проблемами пространства имен (отсюда как-то вводящие в заблуждение », получившего FooleLement, но ожидал, что Foolement«) - любые намеки на то, что здесь не так?

Это было полезно?

Решение

Вы ссылаетесь на fooElement Как будто он не был в отсутствии пространства имен, вам нужно использовать правильное пространство имен в документе вашего экземпляра:

<?xml version="1.0"?>
<example
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                     
  xsi:noNamespaceSchemaLocation="example.xsd" xmlns:shared="http://shared.com">
    <importedElement>
        <shared:fooElement>42</shared:fooElement>
    </importedElement>
    <importedType>
        <bar>42</bar>
    </importedType>
</example>

Редактировать: Я должен был указать: это различия между типы а также элементы; Только последний появляется в документах (с некоторыми исключениями), поэтому ваш импортированный тип работает, как вы хотели, и ваш элемент не делает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top