目标:
创建一个XSD,其中模式中定义的每个xs:元素都需要“type”属性
能够在其他模式中重用已重新定义的http://www.w3.org/2001/XMLSchema
来强制所有已定义的xs:元素需要“type”属性
例如,我希望以下内容在我们的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中的一些奇怪的行为(没有服务包):
在“文本”视图中,并尝试保存,XMLSpy表示架构“无效”
在“架构”视图中,并尝试保存,XMLSpy表示架构有效
尝试在XMLSpy中创建示例XML文件将导致错误,指示架构无效
架构中唯一不应该有效的部分是<xs:element name="SomeElement">
,因为它尚未使用“type”属性定义。
发生的错误与重复声明有关;但正在尝试的是重新定义而不是另一种声明。
问题:
<xs:complexType name="element">
以要求“type”属性?答案 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并且可以使用
任何验证或其他任何。然而,你的延伸完全定义