Xslt 是XML模式';s xs:ID类型对XML元素有效,还是仅对属性有效?

Xslt 是XML模式';s xs:ID类型对XML元素有效,还是仅对属性有效?,xslt,attributes,xsd,element,idref,Xslt,Attributes,Xsd,Element,Idref,在W3C Reco()中,我发现 […]ID是一种属性类型,因此不能应用于属性、元素或其内容 由于我可以在我必须处理的文件中找到一些,我想知道xsi:ID是否真的是有效的xlm元素类型 我现有的xsd提到: <xsd:complexType name="customTypeName"> <xsd:sequence> <xsd:element name="ID" type="xsd:ID"/> <xsd:element name="myEleme

在W3C Reco()中,我发现

[…]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搜索。 我应该放弃还是有办法

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

(好问题,可惜当时没有得到足够的关注。)

ID是一种属性类型,因此不能应用于属性、元素或其内容

这是规范中的一个bug。它应该说“不能应用于元素或其内容”。但在XML模式1.1中:

为了兼容性,ID只能用于属性

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

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

通常使用
xml:id
要好得多。是的,您提到的
fn:id()
函数很好地支持它。另外,使用
xml:id
,人们不需要学习新名称,也不需要额外的名称空间定义


即使XSD验证器接受元素上的
xs:ID
,XPath规范也不会接受它,并且在使用
fn:ID()
时也不会返回它。但是,不管怎样,此函数和返回ID应用于的元素都不需要太大的问题。

遗憾的是,这是您的第一个问题,也是一个很好(很棘手)的问题,但没有引起注意……非常感谢@Abdel(即使是6年后对该问题的认可)我不知道我为什么也不知道是谁漏掉了你的答案,但你能花时间来分析和澄清,真是太好了。我希望这有助于澄清文件;)谢谢你回敬我(名字是“亚伯”,不是“阿卜杜勒”:D)。谁知道呢,这可能对偶尔来访的人有所帮助:)。抱歉@Abel的打字错误!