Схема XML: установка фиксированного значения для атрибута, определенного в базовом типе

#java #xml #web-services #wsdl #xsd

#java #xml #веб-службы #wsdl #xsd

Вопрос:

Можно ли установить значение атрибута xml на фиксированное значение при переопределении базового типа?

Например, мой базовый тип выглядит следующим образом:

 <xs:complexType name="Parameter" abstract="true">
  ... stuff that all parameters have in common ... 
  <xs:attribute name="parameterType" type="ax21:parameterType"/>
</xs:complexType> 
  

Тип ParameterType представляет собой перечисление с двумя возможными значениями:

 <xs:simpleType name="parameterType">
   <xs:restriction base="xs:string">
      <xs:enumeration value="singleParameter" />
      <xs:enumeration value="arrayParameter" />
   </xs:restriction>
</xs:simpleType>
  

Тип параметра не должен использоваться, а служит только основой для двух расширяющих его сложных типов:

 <xs:complexType name="ParameterImpl1">
        <xs:complexContent>
            <xs:extension base="ax21:Parameter">
                ...stuff specific for this implementation of parameter...
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="ParameterImpl2">
        <xs:complexContent>
            <xs:extension base="ax21:WS_Parameter">
                ...stuff specific for this implementation of parameter...
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
  

И в этих подтипах я хотел бы установить для атрибута ParameterType фиксированное значение.
Есть ли какая-либо возможность сделать это?

Кроме того, я хотел бы объяснить предысторию в моем случае — потому что я думаю, что может быть более простое решение всей моей проблемы:
я пишу файл WSDL, а тип параметра используется в качестве входного параметра в операции. Он используется только как интерфейс для двух типов, расширяющих его, но при обработке запроса веб-службы в моем коде на стороне сервера Java (сгенерированном Axis2) я получаю только объект параметра и не могу найти способ определить, какой из двух конкретных подтипов фактически был передан в запросе. (За исключением ручного анализа xmlString объекта Parameter, которого я хочу избежать)

Надеюсь, мои объяснения достаточно точны — просто скажите мне, нужна ли вам дополнительная информация или вы не понимаете, что я пытаюсь сделать.

Заранее спасибо!

Обновить:
После дополнительных исследований по этой теме я думаю, что единственный способ сделать что-то подобное — использовать наследование путем ограничения и полиморфизма, как описано в этой статье:
http://www.ibm.com/developerworks/library/x-flexschema/
Таким образом, в этом случае базовый тип содержит атрибут, а наследующие классы «переопределяют» его, устанавливая фиксированное значение.

Комментарии:

1. К сожалению, ссылка из вашего обновления не работает с 2011 года.

2. Существует архивная версия по адресу web.archive.org/web/20130731050042/http://www.ibm.com /…

Ответ №1:

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

введите описание изображения здесь

 <?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML 2015 Developer Bundle Edition 12.1.2.5004 ([http://www.liquid-technologies.com][2])-->
<xs:schema elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType abstract="true"
                    name="Parameter">
        <xs:attribute name="paramterType"
                      type="parameterType" />
    </xs:complexType>
    <xs:simpleType name="parameterType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="singleParameter" />
            <xs:enumeration value="arrayParameter" />
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="ParameterImpl1">
        <xs:complexContent>
            <xs:restriction base="Parameter">
                <xs:attribute name="paramterType"
                              fixed="singleParameter"
                              type="parameterType" />
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="ParameterImpl2">
        <xs:complexContent>
            <xs:restriction base="Parameter">
                <xs:attribute name="paramterType"
                              fixed="arrayParameter"
                              type="parameterType" />
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>