【问题标题】:Is it possible in an XSD to xs:redefine the xs:complexType element to require the type attribute?是否可以在 XSD 中对 xs:redefine xs:complexType 元素要求 type 属性?
【发布时间】:2013-07-11 09:22:46
【问题描述】:

目标:

  1. 创建一个 XSD,其中架构中定义的每个 xs:element 都需要“type”属性

  2. 能够在其他模式中重新使用重新定义的http://www.w3.org/2001/XMLSchema,以强制所有已定义的 xs:element(s) 需要“type”属性

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

<xs:element name="SomeElement"/>

而以下是有效的

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

这是我尝试重新定义&lt;xs:complexType name="element"&gt; 以要求“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. 架构中唯一无效的部分是 &lt;xs:element name="SomeElement"&gt;,因为它没有使用“类型”属性定义。

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

问题:

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

【问题讨论】:

    标签: xsd schema complextype xmlspy redefine


    【解决方案1】:

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

    你怎么能?毕竟,无论你做什么, 您总是需要从正常的 &lt;xs:schema&gt; 元素开始,该元素已经在该命名空间中定义,并且“定义”在这里意味着 &lt;xs:schema&gt; 的任何可能内容也已经定义。 这里不能有某种引导! 那将是另一种语言。 (虽然确实是个奇怪的想法——写下来并发送给 W3C!)

    好吧,您可以做的是定义您自己的 XML 模式语言(例如“XSDX”)...但在不同的命名空间中,是的,您可以将其基于标准 XSD。只需导入 http://www.w3.org/2001/XMLSchema 命名空间并重用那里定义的任何构造(即全局组件)。 'XSDX' 语言的用途是另一回事......(我想,你必须开发某种新软件才能使用它。)

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

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

    或者,您可以将架构中的 http://www.w3.org/2001/XMLSchema 字符串(临时)替换为表示您的扩展 XML 架构语言的 URI。 然后,任何标准软件都会认为它只是另一个 XML 并使用 它任何验证或其他任何东西。但是,您的扩展的完整定义 XML 模式语言——以一些(普通)XML 模式的形式——仍然是需要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-29
      • 2011-02-17
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      相关资源
      最近更新 更多