Использование keyRef в XSD: как ссылаться на ключ, расположенный в другом XSD (ошибка вне области видимости)

Моя система анализирует два XML-файла (через JAXB неубедительный и xjc сгенерированный код)

  • componentModel.xml: генерируется из инструмента моделирования
  • подробный дизайн.xml: руководство, чтобы добавить информацию

Чтобы избежать проверки кода на содержание и структуры, каждый файл проверяется со своим собственным XSD

  • componentModel.xsd
  • detailedDesign.xsd

Оба эти xsd включают "utilities.xsd", где определены общие сложные и простые типы

Все работает хорошо

Теперь я хочу добавить проверку согласованности:

  • уникальность идентификаторов (названий компонентов)
  • Компоненты в "detailsDesign" должны ссылаться на один из компонентов в "componentModel" через атрибуты "name" и "nameRef"

Вот структуры (я упростил имена и структуры в файлах, чтобы показывать только релевантную информацию). Примечание: как вы можете видеть, я не использую пространство имен, кроме пространства по умолчанию

componentModel.xml

<?xml version="1.0" encoding="UTF-8"?>
<componentModel>
    <components>
        <component name="id1"> ... </component>
        <component name="id1"> ... </component>
        <component name="id2"> ... </component>
    </components>
</componentModel>

componentModel.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >
<xs:include schemaLocation="utilities.xsd" />
<xs:complexType name="CMComponent">
    <xs:complexContent>
            ...
            <xs:attribute name="name" type="MUUpperFirstName" use="required" />
    </xs:complexContent>
</xs:complexType>
<xs:complexType name="CMComponents">
        <xs:sequence>
        <xs:element name="component" type="CMComponent" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
</xs:complexType>
<xs:complexType name="CMComponentModel">
    <xs:complexContent>
            <xs:sequence>
                <xs:element name="components" type="CMComponents">
                    <!--  Key used to check "name" unicity and as a ref by nameRef attribute in detailedDesign model -->
                    <xs:key name="componentNameKey">
                        <xs:selector xpath="component" />
                        <xs:field xpath="@name" />
                    </xs:key>
                </xs:element>
                <xs:element name="functionalChains" minOccurs="0" maxOccurs="1" />
            </xs:sequence>
            <xs:attribute name="name" type="MUModelName" use="required" />
    </xs:complexContent>
</xs:complexType>

<xs:element name="componentModel" type="CMComponentModel" />
</xs:schema>

utilities.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="MUString">
    <xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="MUUpperFirstName">
    <xs:restriction base="MUString">
        <xs:pattern value="([A-Z]+[a-zA-Z0-9]*[.])*[A-Z]+[a-zA-Z0-9]*"/>
    </xs:restriction>
</xs:simpleType>
<xs:simpleType name="MUReferenceName">
    <xs:restriction base="MUString">
        <xs:pattern value="([A-Z]+[a-zA-Z0-9]*[.])*[a-zA-Z]+[a-zA-Z0-9]*"/>
    </xs:restriction>
</xs:simpleType>
</xs:schema>

detailedDesign.xml

<?xml version="1.0" encoding="UTF-8"?>
<detailedDesignModel>
    <components>
        <component nameRef="id1"> ... </component>
        <component nameRef="id2"> ... </component>
        <component nameRef="id3"> ... </component>
    </components>
</detailedDesignModel>

detailedDesign.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="utilities.xsd" />
<xs:include schemaLocation="componentModel.xsd" />
<xs:complexType name="DDMComponent">
    <xs:complexContent>
        ...
        <xs:attribute name="nameRef" type="MUReferenceName" use="required" />
    </xs:complexContent>
</xs:complexType>
<xs:complexType name="DDMComponents">
    <xs:sequence>           
        <xs:element name="component" type="DDMComponent" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
</xs:complexType>
<xs:complexType name="DDMDetailDesignModel">
    <xs:complexContent>
        <xs:sequence>
            <xs:element name="components" type="DDMComponents">
                <xs:keyref name="componentNameKeyRef" refer="componentNameKey">
                    <xs:selector xpath="component" />
                    <xs:field xpath="@nameRef" />
                </xs:keyref>
            </xs:element>
        </xs:sequence>
    </xs:complexContent>
</xs:complexType>

<xs:element name="detailDesignModel" type="DDMDetailDesignModel" />
</xs:schema>

Работает для уникальности атрибута name среди компонентов (ошибка извлечена из ValidationEventHandler установлен на unmarshaller):

Повторяющееся значение ключа [id1] объявлено для ограничения идентичности элемента "компоненты".

Но я не могу заставить работать функцию keyref (ошибка извлечена из ValidationEventHandler установлен на unmarshaller):

Ошибка ограничения идентификации: ограничение идентификации "KeyRef@272ed83b" имеет ссылку на ключ, которая ссылается на ключ или уникальную информацию, которая находится вне области видимости.

Как я могу сделать keyRef, чтобы увидеть ключ, определенный в другом XSD-файле

Спасибо

Matth

0 ответов

Другие вопросы по тегам