【问题标题】:Validating the xml:id Attribute in an XML Schema验证 XML 模式中的 xml:id 属性
【发布时间】:2023-03-04 10:06:02
【问题描述】:

我对 XML 和一般的编码还很陌生。

我正在尝试使用我放在一起的架构来验证 XML 标记。我的元素之一利用了 xml:id 属性。它看起来像这样:<item xml:id="MAT_10_23">。在我的模式中,我在元素声明中遵循了推荐的结构 <xs:attribute name="id" type="xs:ID"/>。这是完整的:

<xs:element name="item">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="label">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:ID"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>

但是,当我尝试验证我的标记时,我被告知“属性 xml:id 不允许出现在元素中”。我尝试在我的架构中分别声明该属性。这是它的样子:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:attribute name="id" type="xs:ID"/>

但这并没有改变任何东西。我需要在架构中进行哪些更改才能成功验证我的 XML 标记?

【问题讨论】:

    标签: xml xsd schema


    【解决方案1】:

    当您希望属性位于 XML 命名空间中时,您已在非命名空间中声明了具有本地名称 id 的属性。您需要:

    (a) 将属性声明替换为

    <xs:attribute ref="xml:id"/>
    

    (b) 为 XML 命名空间的模式添加一个 xs:import(其中包含此属性的声明):

    <xs:import namespace="http://www.w3.org/XML/1998/namespace"/>
    

    您可能还需要添加一个schemaLocation 属性来提供此架构文档副本的位置 - 一些架构处理器会识别命名空间并知道在哪里可以找到它的定义,但我不认为这是对所有处理器都是如此。

    【讨论】:

    • 好的,当我在架构中输入 时,它告诉我“属性 'ref' 不能出现在元素 'attribute' 中”。 schemaLocation 会解决这个问题吗?
    • 您需要在第一次尝试中进行替换,在本地声明属性,而不是在尝试全局声明属性的第二次尝试中。
    • 做到了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多