是否可以在XSD中使用xs:重新定义xs:complexType元素以要求type属性?

时间:2013-07-10 20:45:48

标签: xsd schema complextype xmlspy redefine

目标:

  1. 创建一个XSD,其中模式中定义的每个xs:元素都需要“type”属性

  2. 能够在其他模式中重用已重新定义的http://www.w3.org/2001/XMLSchema来强制所有已定义的xs:元素需要“type”属性

  3. 例如,我希望以下内容在我们的XSD中“无效”(例如在XMLSpy中)

    <xs:element name="SomeElement"/>
    

    而以下是有效的

    <xs:element name="SomeElement" type="abc:SomeType"/>
    

    以下是我尝试重新定义<xs:complexType name="element">以要求“type”属性的架构示例。

    <?xml version="1.0"?>
    <!-- edited with XMLSpy v2013 (http://www.altova.com) -->
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
               targetNamespace="http://www.w3.org/2001/XMLSchema"
               elementFormDefault="qualified" attributeFormDefault="unqualified">
        <xs:redefine schemaLocation="http://www.w3.org/2001/XMLSchema.xsd">
            <xs:complexType name="element" abstract="true">
                <xs:complexContent>
                    <xs:restriction base="xs:element">
                        <xs:attribute name="type" use="required">
                            <xs:simpleType>
                                <xs:restriction base="xs:QName"/>
                            </xs:simpleType>
                        </xs:attribute>
                    </xs:restriction>
                </xs:complexContent>
            </xs:complexType>
            <xs:complexType name="topLevelElement">
                <xs:complexContent>
                    <xs:restriction base="xs:topLevelElement"/>
                </xs:complexContent>
            </xs:complexType>
            <xs:complexType name="localElement">
                <xs:complexContent>
                    <xs:restriction base="xs:localElement"/>
                </xs:complexContent>
            </xs:complexType>
            <xs:complexType name="narrowMaxMin">
                <xs:complexContent>
                    <xs:restriction base="xs:narrowMaxMin"/>
                </xs:complexContent>
            </xs:complexType>
        </xs:redefine>
        <xs:element name="SomeElement"/>
    </xs:schema>
    

    现在,这个架构有一些有趣的方面,以及XMLSpy 2013中的一些奇怪的行为(没有服务包):

    1. 在“文本”视图中,并尝试保存,XMLSpy表示架构“无效”

    2. 在“架构”视图中,并尝试保存,XMLSpy表示架构有效

    3. 尝试在XMLSpy中创建示例XML文件将导致错误,指示架构无效

    4. 架构中唯一不应该有效的部分是<xs:element name="SomeElement">,因为它尚未使用“type”属性定义。

    5. 发生的错误与重复声明有关;但正在尝试的是重新定义而不是另一种声明。

    6. 问题:

      1. 是否可以重新定义<xs:complexType name="element">以要求“type”属性?
      2. 是否可以在具有不同“targetNamespace”的其他XSD中使用此重新定义的类型?

1 个答案:

答案 0 :(得分:0)

由于“XSD”是由W3C控制的W3C XML模式语言, 你无法重新定义其中的任何东西。 具体而言,您无法重新定义http://www.w3.org/2001/XMLSchema中定义的任何内容 命名空间!

你怎么样?毕竟,无论你做什么, 您始终需要从已在该命名空间中定义的普通<xs:schema>元素开始,并且“已定义”在此处表示已定义<xs:schema>的任何可能内容。 这里不能有某种引导! 那将是一种不同的语言。 (虽然确实是一个奇怪的想法 - 写下来并发送给W3C!)

那么,你可以做的是定义你自己的XML模式语言(例如'XSDX')......但是在不同的命名空间中,是的,你可以将它建立在标准的XSD上。只需导入http://www.w3.org/2001/XMLSchema命名空间并重用其中定义的任何构造(即全局组件)。什么可以使用'XSDX'语言是一个不同的故事...(我想,你必须开发一些新的软件来使用它。)

但是,我猜,您的实际目标是验证XML模式 符合某些附加要求(例如关于“类型”属性)。

你可以通过开发某种额外验证器来实现这一点。

或者,您可以使用表示扩展XML模式语言的URI替换(临时)模式中的http://www.w3.org/2001/XMLSchema字符串。 然后,任何标准软件都会认为它只是另一种XML并且可以使用 任何验证或其他任何。然而,你的延伸完全定义

,仍然需要XML模式语言 - 以某种(普通)XML模式的形式