Отмена сопоставления xsd с выборочной заменой элемента из другого xsd

#xsd #jaxb #unmarshalling

#xsd #jaxb #отмена сопоставления

Вопрос:

Я новичок в работе с xsd и jaxb, поэтому, если мои вопросы невежественны, пожалуйста, просветите меня. Кроме того, если вам нужна дополнительная информация, дайте мне знать, и я предоставлю все, что смогу.

В нашей компании мы работаем с источниками xsd от третьей стороны. Нам нужно реализовать перевод SOAP — Java, и у нас есть куча файлов .wsdl и .xsd для работы. Мы столкнулись с проблемами с двумя файлами .xsd. Третья сторона предоставляет «datatypes.xsd» с пространством имен org.hl7.v3 и «datatypes-extensions-hl7nl.xsd» с пространством имен nl.hl7.v3.

Когда я разархивирую исходные файлы xds, результирующие файлы .java создаются в другом пакете, названном в честь их собственных пространств имен: org /hl7 / v3 и nl / hl7 / v3.

Принимая во внимание, что третья сторона намеревалась, где это применимо, типы из «datatypes-extensions.xsd» имеют приоритет и должны генерироваться вместо типов из «datatypes.xsd» и в том же пакете.

Что я пробовал до сих пор

Поскольку я не могу изменить исходники xsd, я (безуспешно) попробовал 2 вещи, используя файл .jxb.

1. генерация файлов .java в одном каталоге. Это привело к проблемам перезаписи.

2: предоставление привязки, указывающей на правильный тип:

 <jaxb:bindings schemaLocation="../coreschemas/datatypes.xsd">
        <jaxb:bindings node="//xs:complexType[@name='TEL']">
            <jaxb:class ref="nl.hl7.v3.TEL"/>
        </jaxb:bindings>
    </jaxb:bindings>
  

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

Источники

Исходные тексты являются открытыми, поэтому, если вы хотите увидеть их сами: https://decor.nictiz.nl/pub/vzvz/kz-vzvz-xml-20190122T131422.zip

.wsdl:

 <?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
             xmlns="http://schemas.xmlsoap.org/wsdl/"
             xmlns:hl7="urn:hl7-org:v3"
             targetNamespace="urn:hl7-org:v3"
             name="OpvragenOverdrachtconcerns">
   <documentation> WSDL implementatie van OpvragenOverdrachtconcerns</documentation>
   <types>
      <xsd:schema targetNamespace="urn:hl7-org:v3" elementFormDefault="qualified">
         <xsd:include schemaLocation="../schemas_codeGen/REPC_IN990110NL.xsd"/>
      </xsd:schema>
      <xsd:schema targetNamespace="urn:hl7-org:v3" elementFormDefault="qualified">
         <xsd:include schemaLocation="../schemas_codeGen/REPC_IN990111NL.xsd"/>
      </xsd:schema>
   </types>
   <message name="REPC_IN990110NL">
      <part name="body" element="hl7:REPC_IN990110NL"/>
   </message>
   <message name="REPC_IN990111NL">
      <part name="body" element="hl7:REPC_IN990111NL"/>
   </message>
  

Заголовок ответного сообщения типа: REPC_IN990111NL:

 <?xml version="1.0" encoding="UTF-8"?>
<!-- REPC_IN990111NL - Opleveren overdrachtconcerns --><!--Note: this file was generated. DO NOT EDIT HERE.--><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="urn:hl7-org:v3"
           targetNamespace="urn:hl7-org:v3"
           elementFormDefault="qualified">
  

Заголовок и определение конфликтующего типа в datatypes.xsd:

 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:hl7="urn:hl7-org:v3" xmlns:hl7nl="urn:hl7-nl:v3"
    xmlns:sch="http://www.ascc.net/xml/schematron" elementFormDefault="qualified" targetNamespace="urn:hl7-org:v3" xmlns="urn:hl7-org:v3">
    <xsd:include schemaLocation="voc.xsd"/>
    <xsd:import namespace="urn:hl7-nl:v3" schemaLocation="datatypes-extensions-hl7nl.xsd"/>
  
 <xsd:complexType name="TEL">
        <xsd:complexContent>
            <xsd:extension base="URL">
                <xsd:sequence>
                    <xsd:element name="useablePeriod" type="IVL_TS" minOccurs="0"
                        maxOccurs="unbounded">
                        <!-- FIXME: one would expect the name "GTS" here but it's not
          SXCM does ALL the right things, it's just not the right NAME. -->
                    </xsd:element>
                    <xsd:element name="id" type="II" minOccurs="0"/>
                </xsd:sequence>
                <xsd:attribute name="use" type="set_cs_TelecommunicationAddressUse" use="optional">
                </xsd:attribute>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
  

Заголовок и введите типы данных-расширение-hl7nl.xsd

 <?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:hl7="urn:hl7-org:v3" xmlns="urn:hl7-nl:v3" xmlns:sch="http://purl.oclc.org/dsdl/schematron" targetNamespace="urn:hl7-nl:v3">
    <xsd:import schemaLocation="datatypes.xsd" namespace="urn:hl7-org:v3"/>
  
 <xsd:complexType name="TEL">
        <xsd:complexContent>
            <xsd:extension base="ANY">
                <xsd:sequence>
                    <xsd:element name="useablePeriod" type="QSET_TS" minOccurs="0"/>
                </xsd:sequence>
                <xsd:attribute name="value" type="xsd:anyURI" use="optional"/>
                <xsd:attribute name="use" type="set_TelecommunicationAddressUse" use="optional"/>
                <xsd:attribute name="capabilities" type="set_TelecommunicationCapability" use="optional"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
  

Ожидаемые и фактические результаты

Как указано выше, вместо генерации двух пакетов в соответствии с разными пространствами имен, один должен быть создан с типами «nl.hl7.v3», генерируемыми вместо типов «org.hl7.v3» с тем же именем.

Заранее благодарим вас за потраченное время.

Макс