将属性设置为XML Schema中的所有类型

时间:2015-07-05 21:42:21

标签: xsd attributes

我将我的脚本设置存储在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中将属性设置为所有类型?

1 个答案:

答案 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中没有用于集中声明属性可能/必须存在于所有元素上的机制。