首页 > 解决方案 > 单个元素下的多个 xs:id 属性 - XSD 定义

问题描述

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

这是 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 用红色强调并抱怨:

属性“null-id”不允许出现在元素“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 ”,这是非法的吗?如果是这样,我的“最安全”的选择是什么?看来#3...

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

标签: xmlxsdxsd-validationxml-validation

解决方案


XSD 1.0中的xs:ID类型,

3.3.8 身份证

[定义:] ID 表示 [XML 1.0 (第二版)] 中的 ID 属性类型。

派生自IDXML/DTD 中的属性类型,

有效性约束:每个元素类型一个 ID

一种元素类型不得指定多个 ID 属性。

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

替代品xs:uniquexs:key没有这样的限制。


注意:XSD 1.1ID中,每个元素允许多个属性:

G.1.7 ID、IDREF 和相关类型

一个元素现在可能有多个 type 属性xs:ID。元素总是可以有多个 type 的子元素xs:ID,但是 XSD 1.0 禁止这种类型的多个属性以与 XML DTD 兼容。(旨在可转换为 DTD 形式的模式仍应避免这种做法。)此更改应使 XML 词汇表更容易支持现有ID属性和xml:ID.

(感谢 Michael Kay 提供的有用更新。)


推荐阅读