带有元素和属性的 XSD 扩展

Posted

技术标签:

【中文标题】带有元素和属性的 XSD 扩展【英文标题】:XSD Extension with Element AND Attribute 【发布时间】:2011-09-15 10:36:23 【问题描述】:

我需要创建一个 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>

另外,我需要这个标签能够通过从http://www.springframework.org/schema/integration/spring-integration-1.0.xsd 扩展 inputOutputEndpointType 来接收和发送来自通道的消息。所以理想情况下我应该有这样的东西:

<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:派生类型的内容类型和 它的基础必须都是混合的,或者都是纯元素的。类型 '#AnonType_dbengine3' 只是元素,但它的基本类型不是。

添加 mixed="true" 属性并没有帮助,到目前为止,解决此问题的所有其他尝试都失败了。

【问题讨论】:

【参考方案1】:

我在我的 XML 架构编辑器中尝试了您的架构,但您的 sn-p 没有任何错误(我必须将其放在 xsd:schema 中,并为查询复杂类型添加一个虚拟定义)。

我认为您只是遇到了 Eclipse 编辑器的问题。活体证明在同一个文件中,请查看“innerEndpointDefinitionAware”complexType。

您应该尝试使用 Eclipse 的一件事是在同一个文件夹中实际下载 spring-integration-1.0.xsd、spring-beans-2.0.xsd 和 sprint-tool-2.0.xsd。编辑集成文件以确保为 xsd:imports 手动将 schemaLocation 添加到已下载的文件中。再试一次,看看会发生什么。如果可行,则该问题与几乎所有 Spring 模式使用的“悬空”方法有关(使用 xsd:import 而不使用 schemaLocation)。对于悬空定义,由模式处理器(在您的情况下由 Eclipse 提供)来解析这些名称空间。

在我将编辑器配置为将悬空定义解析为适当版本的 bean 和工具之后,即使没有下载,它也可以使用我的编辑器 - 也许 Eclipse 支持相同?

【讨论】:

【参考方案2】:

我找不到实现它的方法,这是我的解决方法。我刚刚创建了一个新的 complexType,它替代了 spring 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" >

【讨论】:

以上是关于带有元素和属性的 XSD 扩展的主要内容,如果未能解决你的问题,请参考以下文章

如何在 XSD 复杂类型定义中混合扩展和限制

带有“必需”属性选项的 XSD 相关查询

如何定义XSD并在XML中使用XSD

XSD 元素替换组示例?

xsd 后缀文件用啥软件打开

带有来自其他命名空间的元素的 XSD