将属性设置为 XML 架构中的所有类型
Set attribute to all types in XML Schema
我将我的脚本设置存储在 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>
问题是我需要为 XML
的每个元素添加属性 system
。此时我不能简单地写:
<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
但它需要很多 space 并且可读性不是很好。
是否可以在XSD
中将属性设置为所有类型?
用于全局定义要在许多位置使用的公共属性的选项包括:
- 所有类型都派生自包含属性的通用类型。
- 使用您已经提到的
xs:attribute/@ref
。
- 使用
xs:attributeGroup/@ref
,这将允许您引用多个
通常共同声明的属性。 更新:在XSD 1.1中,一个默认属性
组可以通过 defaultAttributes
在 xs:schema
元素上指定 适用于所有
复杂的类型定义。 感谢@sergioFC 提出这个好主意。
- 使用
xs:any
元素,然后(在XSD1.1)xs:assert
关于属性,但是
然后你失去了大部分正常的元素和属性声明
由于 xs:any
的内在宽大处理。
除此类间接选项外,XSD 中没有任何机制可以集中说明属性 may/must 出现在所有元素上。
我将我的脚本设置存储在 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>
问题是我需要为 XML
的每个元素添加属性 system
。此时我不能简单地写:
<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
但它需要很多 space 并且可读性不是很好。
是否可以在XSD
中将属性设置为所有类型?
用于全局定义要在许多位置使用的公共属性的选项包括:
- 所有类型都派生自包含属性的通用类型。
- 使用您已经提到的
xs:attribute/@ref
。 - 使用
xs:attributeGroup/@ref
,这将允许您引用多个 通常共同声明的属性。 更新:在XSD 1.1中,一个默认属性 组可以通过defaultAttributes
在xs:schema
元素上指定 适用于所有 复杂的类型定义。 感谢@sergioFC 提出这个好主意。 - 使用
xs:any
元素,然后(在XSD1.1)xs:assert
关于属性,但是 然后你失去了大部分正常的元素和属性声明 由于xs:any
的内在宽大处理。
除此类间接选项外,XSD 中没有任何机制可以集中说明属性 may/must 出现在所有元素上。