【问题标题】:How to declare an attribute ID in XML如何在 XML 中声明属性 ID
【发布时间】:2020-11-27 15:30:34
【问题描述】:

我正在编写一些 XML 和 XSD 作为作业... 在我的 XML 中,我有一个名为 a 的标签(不是实际名称)和名为 id 的属性。我的部分 XML 如下所示:

    <a id="1">
    ...........
    </a>
    <a id="1">
    ............
    </a>

当我使用 XSD 进行验证时,它不会给出错误....

    <xsd:attribute name="id" type="xsd:string" />

我尝试使用 xsd:ID 作为属性 id 的数据类型,但它给了我一个错误;我无法弄清楚问题是什么。

我该怎么做?

【问题讨论】:

  • 所以如果分配 xsd 不会出错,但如果不分配 xsd 会出错?

标签: xml xsd


【解决方案1】:

您应该重新使用type="xsd:ID"。除了确保值是唯一的之外,它还允许您使用xsd:IDREF 进行引用。

当您尝试使用 xsd:ID 时遇到的错误是 ID 值必须以字母开头。如果您将您的 ID 更改为“ID-1”/“ID-2”或“a1”/“a2”之类的名称,它会正常工作。

示例架构:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xsd:element name="doc">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element maxOccurs="unbounded" ref="a"/>
        <xsd:element maxOccurs="unbounded" ref="b"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="a">
    <xsd:complexType>
      <xsd:simpleContent>
        <xsd:extension base="xsd:string">
          <xsd:attribute name="id" use="required" type="xsd:ID"/>
        </xsd:extension>
      </xsd:simpleContent>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="b">
    <xsd:complexType>
      <xsd:simpleContent>
        <xsd:extension base="xsd:string">
          <xsd:attribute name="idref" use="required" type="xsd:IDREF"/>
        </xsd:extension>
      </xsd:simpleContent>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

示例 XML:

<doc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="Untitled1.xsd">
  <a id="ID-1">
    ...........
  </a>
  <a id="ID-2">
    ............
  </a>
  <b idref="ID-1"/>
</doc>

【讨论】:

  • 如何向我的 xml 添加一些文本以指定每个元素的属性 id 的类型为 xsd:ID?是否可以将此声明嵌入文档本身?
  • This (somewhat dated) article 讨论了使用keykeyrefunique 而不是IDIDREF。有什么相关的吗?
【解决方案2】:

"1" 是一个有效字符串,因此验证不会返回错误。 如果你想指定一些限制(例如“id 应该以字母开头”),你必须声明你的类型并指定模式:

<xsd:simpleType name="myID">
    <xsd:restriction base="xsd:string">
        <xsd:pattern value="[a-zA-Z].*"/>
    </xsd:restriction>
</xsd:simpleType>
....
  <xsd:attribute name="id" type="myID"/>
....

如果要指定唯一性限制,可以像这样使用 xsd:unique 元素:

<xsd:element name="root" type="myList">
  <xsd:unique name="myId">
    <xsd:selector xpath="./a"/>
    <xsd:field xpath="@id"/>
  </xsd:unique>
</xsd:element> 

这意味着声明为“myList”的元素“root”应该包含具有唯一属性“id”的子元素“a”

【讨论】:

  • 我想要的是每个元素都有一个 id 属性,并确保每个 id 值都是唯一的
  • 我刚刚添加了一条关于 xsd:unique 功能的评论。它会帮助你。
【解决方案3】:

XML 文件中的 ID 属性类型必须以字母和一些有限的特殊字符开头。

在 XML 文件中尝试这种类型的 ID,例如:

............ …………

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2012-02-07
    • 2017-08-27
    • 2014-12-31
    • 2015-02-13
    • 2018-09-23
    • 2021-09-19
    相关资源
    最近更新 更多