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

时间:2018-04-27 15:04:53

标签: xml xsd xsd-validation xml-validation

我在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以红色突出显示并抱怨:

  

属性&#39; null-id&#39;不允许出现在元素&#39; visitor-test

有什么作用:

  1. 如果我将XML属性更改为null-node,即null-node="f">
  2. 如果我在XSD中颠倒属性null-node和null-id的顺序(但是null节点会出现同样的问题)
  3. 如果我将XSD中任一属性的类型更改为xs:String,例如<xs:attribute name="null-node" type="xs:string" default="null-node"/>
  4. 由于这不是我的代码,并且我不确定这些是用于什么的,我想知道,我的前任是否在同一元素上定义了两个ID属性时出错?根据&#34; http://www.w3.org/2001/XMLSchema&#34;这是非法的吗?如果是这样的话,最安全的是什么?选择我的?好像#3 ......

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

1 个答案:

答案 0 :(得分:1)

XSD 1.0 中的xs:ID类型,

  

3.3.8 ID

     

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

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

  

Validity constraint: One ID per Element Type

     

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

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

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

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

  

G.1.7 ID, IDREF, and related types

     

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

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

相关问题