我正在编写一些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
的数据类型,但它给了我一个错误;我无法弄清楚问题是什么。
我该怎么做?
答案 0 :(得分:15)
您应该回到使用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>
答案 1 :(得分:1)
“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”
答案 2 :(得分:-1)
XML文件中的ID属性类型必须以字母和一些有限的特殊字符开头。
例如在XML文件中尝试这种类型的ID:
...... ............