XML Schema xsd:ID类型对XML元素有效,还是仅对属性有效?

时间:2014-02-07 10:49:25

标签: xslt attributes xsd element idref

在W3C Reco(here)中,我找到了

  

[...] ID是一种属性,因此无法应用于属性,元素或其内容

我可以在文件中找到一些我必须处理的内容,我想知道xsi:ID是否真的是一个有效的xlm元素类型

我现有的xsd提到:

<xsd:complexType name="customTypeName">
 <xsd:sequence>
  <xsd:element name="ID" type="xsd:ID"/>
  <xsd:element name="myElement" type="string"/>
 </xsd:sequence>
</xsd:complexType>

但根据我的阅读,我宁愿认为有效的声明应该是

<xsd:complexType name="customTypeName">
<xsd:element name="myElement" type="string"/>
<attribute name="ID" type="xsd:ID" use="required"/>  
</xsd:complexType>

但不幸的是,我无法改变已经使用过的xsd ...... 我愿意使用id()函数应用xslt搜索。 我应该放弃还是有办法?

感谢您对我在论坛上提出的第一个问题的任何帮助。

1 个答案:

答案 0 :(得分:0)

很好的问题,可惜它当时没有得到足够的重视。)

  

ID是一种属性,因此无法应用于属性,元素或其内容

这是规范中的一个错误。应该说&#34;不能应用于元素或其内容&#34; 。但是在XML Schema 1.1 it is quite clear中:

  

为了兼容性,ID应仅用于属性。

这意味着,您可以将类型应用于属性,但不能应用于元素,但它通常不会引发错误。

然而,使用xs:ID并不总是具有人们期望的效果。例如,它期望NCName,这意味着它不能以数字开头。此外,不强制执行唯一性约束。

使用xml:id通常要好得多。它是well-defined by the spec,并且您所引用的fn:id()函数可以很好地支持它。此外,使用xml:id,人们不需要学习新名称,也不需要额外的命名空间定义。

即使您的XSD验证程序在元素上接受xs:ID,XPath规范也不接受它,并且在使用fn:id()时不会返回它。但是,无论如何,此函数和element-with-id() function都会返回应用ID的元素,因此不需要太多问题。