Расширение XSD с элементом и атрибутом - PullRequest
3 голосов
/ 15 сентября 2011

Мне нужно создать XSD, который будет проверять следующий тип XML:

<dbengine stylesheet="file:transformation.xslt">
   <queries>
      <query name="update" inputtype="file">file:/src/test.sql</query>
      <query name="update" inputtype="sql">select * from test</query>
   </queries>
</dbengine>

Это можно сделать, сформулировав следующую схему:

<xsd:element name="dbengine">
    <xsd:complexType>   
        <xsd:sequence>
            <xsd:element name="queries" type="queries" minOccurs="1"/>
        </xsd:sequence>
        <xsd:attribute name="stylesheet" type="xsd:string" use="optional"/>
    </xsd:complexType>
</xsd:element>

Кроме того, мне нужноэтот тег, чтобы иметь возможность получать и отправлять сообщения из / в канал путем расширения inputOutputEndpointType из http://www.springframework.org/schema/integration/spring-integration-1.0.xsd. Так что в идеале у меня должно быть что-то вроде этого:

<xsd:element name="dbengine">
    <xsd:complexType>
        <xsd:complexContent>            
            <xsd:extension base="int:inputOutputEndpointType" >
                <xsd:sequence>
                    <xsd:element name="queries" type="queries" minOccurs="1"/>
                </xsd:sequence>         
            <xsd:attribute name="stylesheet" type="xsd:string" use="optional"/>         
            </xsd:extension>                        
        </xsd:complexContent>       
    </xsd:complexType>
</xsd:element>

Однако это приводит к ошибке (в редакторе eclipse):

cos-ct-extends.1.4.3.2.2.1.a: Тип содержимого производного типа и его базового должен быть смешанным или оба должны быть element-только.Тип '# AnonType_dbengine3' является только элементом, но его базовый тип - нет.

Добавление атрибута mixed = "true" не помогает, и любая другая попытка решить эту проблему до сих пор не удалась.

Ответы [ 2 ]

0 голосов
/ 16 сентября 2011

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

<xsd:complexType name="workaround">
    <xsd:attribute name="output-channel" type="xsd:string">
        <xsd:annotation>
            <xsd:appinfo>
                <tool:annotation kind="ref">
                    <tool:expected-type type="org.springframework.integration.core.MessageChannel" />
                </tool:annotation>
            </xsd:appinfo>
        </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="input-channel" type="xsd:string">
        <xsd:annotation>
            <xsd:appinfo>
                <tool:annotation kind="ref">
                    <tool:expected-type type="org.springframework.integration.core.MessageChannel" />
                </tool:annotation>
            </xsd:appinfo>
        </xsd:annotation>                   
    </xsd:attribute>
    <xsd:attribute name="order" type="xsd:string">
    </xsd:attribute>
    <xsd:attribute name="auto-startup" type="xsd:string" />
</xsd:complexType>

в теге dbengine я расширяю этот complexType:

<xsd:extension base="workaround" >
0 голосов
/ 16 сентября 2011

Я попробовал вашу схему в своем редакторе XML-схем, и я не получил никакой ошибки для вашего фрагмента (мне пришлось поместить ее в схему xsd: и добавить фиктивное определение для сложного типа запросов).

Я думаю, что у вас просто проблема с редактором Eclipse. Живое доказательство находится в том же файле, пожалуйста, взгляните на complexType «innerEndpointDefinitionAware».

Одна вещь, которую вы должны попробовать с Eclipse, - это на самом деле скачать spring -gration-1.0.xsd, spring-beans-2.0.xsd и sprint-tool-2.0.xsd в одной папке. Отредактируйте файл интеграции, чтобы убедиться, что для импорта xsd: вы вручную добавляете schemaLocation к загруженным файлам. Попробуйте еще раз и посмотрите, что произойдет. Если это работает, тогда проблема связана с «висячим» подходом, используемым почти всеми схемами Spring (использование xsd: import без schemaLocation). С висячими определениями, это зависит от процессора схемы (в вашем случае предоставленного Eclipse) для разрешения этих пространств имен.

С моим редактором он работал даже без загрузки, после того как я настроил его для разрешения определения висячих в соответствующих версиях bean-компонентов и инструментов - может быть, Eclipse поддерживает то же самое?

...