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

Можно ли установить значение атрибута 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, а тип Parameter используется в качестве входного параметра в операции.Он используется только в качестве интерфейса для двух расширяющих его типов, но при обработке запроса веб-службы в моем коде Java-сервера (создан Axis2) я получаю только объект Parameter и не могу найтилюбой способ определить, какой из двух конкретных подтипов фактически был передан в запросе.(За исключением ручного разбора xmlString объекта Parameter , которого я хочу избежать)

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

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

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

1 Ответ

1 голос
/ 20 августа 2014

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

enter image description here

<?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>
...