1

目标:

  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"/>

这是一个模式示例,我试图重新定义它<xs:complexType name="element">以要求“类型”属性。

<?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">因为它没有用“类型”属性定义。

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

问题:

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

1 回答 1

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 模式是否符合一些附加要求(例如,关于“类型”属性)。

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

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

于 2013-07-11T00:42:23.047 回答