Компиляция XML-схемы в Java с ограничениями идентичности key / keyref
Допустим, у меня есть следующая XML-схема:
<xs:schema
xmlns="http://www.example.com/data"
xmlns:data="http://www.example.com/data"
targetNamespace="http://www.example.com/data"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="data">
<xs:complexType>
<xs:all>
<xs:element name="countries">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="country" type="country"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="types">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="type" type="type"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="products">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="product" type="product"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
<xs:key name="countryNameKey">
<xs:selector xpath=".//data:country"/>
<xs:field xpath="@name"/>
</xs:key>
<xs:key name="typeNameKey">
<xs:selector xpath=".//data:type"/>
<xs:field xpath="@name"/>
</xs:key>
<xs:keyref name="countryNameRef" refer="data:countryNameKey">
<xs:selector xpath=".//data:product"/>
<xs:field xpath="@country"/>
</xs:keyref>
<xs:keyref name="typeNameRef" refer="data:typeNameKey">
<xs:selector xpath=".//data:product"/>
<xs:field xpath="@type"/>
</xs:keyref>
<xs:unique name="uniqueProducts">
<xs:selector xpath=".//data:product"/>
<xs:field xpath="@country"/>
<xs:field xpath="@type"/>
</xs:unique>
</xs:element>
<xs:complexType name="country">
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="type">
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="product">
<xs:attribute name="country" type="xs:string" use="required"/>
<xs:attribute name="type" type="xs:string" use="required"/>
</xs:complexType>
</xs:schema>
Извините за надуманный пример.
Как видите, это табличные данные. Я определяю некоторые страны, затем я определяю некоторые виды продукции. Затем я определяю отдельные продукты как тип из страны, например, сыр из Франции.
Здесь важно отметить, что я используюkey
а такжеkeyref
для перекрестной ссылки на все товары обратно в исходную страну / тип.
Итак, мой вопрос:
Можно ли скомпилировать эту схему в классы Java, которые можно распаковать, используя Eclipse Moxy с неповрежденными перекрестными ссылками?
Я знаю, что спецификация JAXB 2.0 делаетне поддерживает ключ / keyref, Я тоже знаю чтоМокси ли.1
Кроме того, я знаю, что Moxy не имеет подключаемого модуля Maven и, в любом случае, использует сгенерированные классы XJC и просто добавляетjaxb.properties
файл, чтобы указать поставщика JAXB для использования.2
Поэтому я подозреваю, что ответ на мой вопрос «нет, вы должны сами создавать уроки», но я решил проверить, прежде чем покинуть надежду.
Чтобы уточнить, мойproduct
элемент в настоящее время компилируется (используяMaven-jaxb2-плагин) чтобы
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "product")
public class Product implements Cloneable, CopyTo, Equals, HashCode, ToString {
@XmlAttribute(name = "country", required = true)
protected String country;
@XmlAttribute(name = "type", required = true)
protected String type;
//getters and setters
}
Оно, ссылается наString
скорее, чемCountry
а такжеType
объекты.