Использование 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