我将我的脚本设置存储在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
并且我有很多自己的类型。其中许多只在一个地方使用。实际上我将属性system
设置为XSD
中的每个类型,但它占用了大量空间并且不太可读。
是否可以在XSD
中将属性设置为所有类型?
答案 0 :(得分:2)
全局定义要在许多位置使用的公共属性的选项包括:
xs:attribute/@ref
。xs:attributeGroup/@ref
,这将允许您引用多个
共同声明的属性。 更新:在XSD 1.1中,defaultAttributes
元素上的default attribute
group can be specified xs:schema
适用于所有xs:any
元素
复杂的类型定义。 感谢@sergioFC这个好主意。 xs:assert
元素,然后(在XSD 1.1中)xs:any
关于属性,但是
然后你失去了大部分正常的元素和属性声明
{{1}}内在宽容的设施。除了这些间接选项之外,XSD中没有用于集中声明属性可能/必须存在于所有元素上的机制。