【问题标题】:Set attribute to all types in XML Schema将属性设置为 XML Schema 中的所有类型
【发布时间】: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 &lt;schema&gt; 添加所有复杂元素必须具有的属性列表。这可以使用复杂类型中的 _defaultAttributesApply _ 属性覆盖。不幸的是,这不适用于 simpleTypes,但也许您可以使用一种解决方法,例如使用断言的没有内容的复杂类型。 See this.4
  • @sergioFC "这不适用于 simpleTypes" - 这是有道理的。我现在意识到 simpleTypes 可以在属性中使用,所以它们不能需要属性。我可以将它们包装在 complexTypes 中。请把这个写成答案,这样我就可以给你投票了。
  • 谢谢,但此信息现在出现在用户 kjhughes 答案中,添加了另一个选项。没有必要复制它。

标签: xsd attributes


【解决方案1】:

您在全局定义要在许多位置使用的通用属性的选项包括:

  • 让所有类型都派生自包含该属性的通用类型。
  • 使用您已经提到的xs:attribute/@ref
  • 使用xs:attributeGroup/@ref,这将允许您引用多个 共同声明的属性。 更新:在 XSD 1.1 中,default attribute group can be specified 通过 defaultAttributesxs:schema 元素上适用于所有 复杂的类型定义。 感谢@sergioFC 这个好主意。
  • 使用xs:any 元素,然后(在XSD 1.1 中)xs:assert 关于属性,但是 那么你失去了大部分正常的元素和属性声明 由于xs:any 的内在宽大处理。

除了这些间接选项外,XSD 中没有任何机制可以集中声明某个属性可能/必须出现在所有元素上。

【讨论】:

  • 好答案,我要补充一点,这可以与我在my comment中提到的 defaultAttributes 属性一起使用
  • 我接受了这个答案,因为defaultAttributes 似乎是正确的解决方案,我不希望有更好的解决方案。但是,我找不到任何支持XSD 1.1XML 验证器:(
猜你喜欢
  • 2019-01-19
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多