【发布时间】:2015-07-11 02:38:02
【问题描述】:
我将脚本的设置存储在XML 文档中。该脚本是多平台的,但它的某些设置不是。我在XSD 文件中创建了正确的属性。它决定设置到哪个系统。
<xs:attribute name="system" use="optional" default="none">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="none"/>
<xs:enumeration value="windows"/>
<xs:enumeration value="unix"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
XML 文件示例如下所示。 (不要看得太仔细,只是一个例子。)
<root>
<name>Foo</name>
<path system="windows">%appdata%\Bar</path>
<path system="unix">~/Bar/</path>
<foo system="unix">
<bar>baz</bar>
<!-- more elements -->
</foo>
<foo>
<bar system="windows">baz</bar>
<!-- more elements -->
</foo>
</root>
问题是我需要将属性system 添加到XML 的每个元素中。此刻我不能简单地写:
<xs:element name="path" type="xs:string"/>
我必须写:
<xs:element name="path">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="system"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
(我知道我之前可以定义复杂类型并多次使用它。)它非常扩展XSD,并且我有很多我自己的类型。其中许多只在一个地方使用。实际上,我在XSD 中为每种类型设置了属性system,但它占用了大量空间并且可读性不强。
是否可以将属性设置为XSD 中的所有类型?
【问题讨论】:
-
在 xsd1.0 中,这是不可能的,AFAIK。
-
@Win.ubuntu 可以是xsd1.1。
-
在 XSD 1.1 中,您可以使用
defaultAttributes attribute in <schema>添加所有复杂元素必须具有的属性列表。这可以使用复杂类型中的 _defaultAttributesApply _ 属性覆盖。不幸的是,这不适用于 simpleTypes,但也许您可以使用一种解决方法,例如使用断言的没有内容的复杂类型。 See this.4 -
@sergioFC "这不适用于 simpleTypes" - 这是有道理的。我现在意识到 simpleTypes 可以在属性中使用,所以它们不能需要属性。我可以将它们包装在 complexTypes 中。请把这个写成答案,这样我就可以给你投票了。
-
谢谢,但此信息现在出现在用户 kjhughes 答案中,添加了另一个选项。没有必要复制它。
标签: xsd attributes