在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搜索。 我应该放弃还是有办法?
感谢您对我在论坛上提出的第一个问题的任何帮助。
答案 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的元素,因此不需要太多问题。