单个元素下的多个 xs:id 属性 - XSD 定义

Multiple xs:id Attributes Under Single Element - XSD Definition

我在 IntelliJ 2015 (IJ) 中尝试使用具有两个 "xs:ID" 类型属性的元素定义 XSD 时遇到错误。不幸的是,我从一个早已离开的人那里继承了这段代码,所以不确定他们到底想要实现什么。

这是 XSD 的精简版:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    ...
    <xs:element name="visitor-test">
        <xs:complexType>
            ...
            <xs:attribute name="null-node" type="xs:ID" default="null-node"/>
            <xs:attribute name="null-id" type="xs:ID" default="null-id"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

这里是 XML 的开头,错误是:

<?xml version="1.0" encoding="UTF-8"?>
<visitor-test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="visitor-test-schema.xsd" null-id="f">

IJ 正在用红色下划线表示抱怨:

Attribute 'null-id' is not allowed to appear in element 'visitor-test

什么有效:

  1. 如果我将 XML 属性更改为空节点,即 null-node="f">
  2. 如果我在 XSD 中颠倒属性 null-node 和 null-id 的顺序(但是对于 null-node 也会出现同样的问题)
  3. 如果我将 XSD 中任一属性的类型更改为 xs:String,例如<xs:attribute name="null-node" type="xs:string" default="null-node"/>

由于这不是我的代码,而且我不确定它们的用途,我想知道,我的前任是否在同一元素上定义两个 ID 属性时犯了错误?根据“http://www.w3.org/2001/XMLSchema”,这是非法的吗?如果是这样,我的 "safest" 选择是什么?似乎#3...

此外,#1 和#2 一起意味着只有 XSD 中定义的第一个属性似乎是有效的,随后的属性是不允许的。奇怪的是,IDE.

建议这两个属性

xs:ID输入XSD1.0,

3.3.8 ID

[Definition:] ID represents the ID attribute type from [XML 1.0 (Second Edition)].

派生自 XML/DTD、

中的 ID 属性类型

Validity constraint: One ID per Element Type

An element type must not have more than one ID attribute specified.

您可以看到每个元素类型只允许一个 ID 属性。

备选方案 xs:unique and xs:key 没有此类限制。


注:XSD1.1中,每个元素允许多个ID属性:

G.1.7 ID, IDREF, and related types

An element may now have multiple attributes of type xs:ID. Elements have always been able to have multiple children of type xs:ID, but XSD 1.0 forbad multiple attributes of this type for compatibility with XML DTDs. (Schemas intended to be translatable into DTD form should still avoid the practice.) This change should make it easier for XML vocabularies to support both existing ID attributes and xml:ID.

(感谢 Michael Kay 的帮助更新。)