将属性设置为 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中,一个默认属性 组可以通过 defaultAttributesxs:schema 元素上指定 适用于所有 复杂的类型定义。 感谢@sergioFC 提出这个好主意。
  • 使用xs:any元素,然后(在XSD1.1)xs:assert关于属性,但是 然后你失去了大部分正常的元素和属性声明 由于 xs:any 的内在宽大处理。

除此类间接选项外,XSD 中没有任何机制可以集中说明属性 may/must 出现在所有元素上。