Разобрать xsd с выборочной заменой элемента из другого xsd - PullRequest
1 голос
/ 08 апреля 2019

Я новичок в работе с 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>

Заголовок и введите datatypes-extension-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" с тем же именем.

Спасибо, что уделили время.

Макс

...