我有一个我无法解决的问题。我的XSD非常复杂,但这里有一个更简单的代码,它有同样的问题。
这是XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema id="Race"
xmlns:xs = "http://www.w3.org/2001/XMLSchema"
targetNamespace="myrace.org/"
xmlns="myrace.org/"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="race" msdata:IsDataSet="true">
<xs:complexType>
<xs:sequence>
<xs:element name="runner" type="runnerType" maxOccurs="10">
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:keyref name="predecessorKey" refer="runKey">
<xs:selector xpath="runner/predecessor"/>
<xs:field xpath="@foreignKey"/>
</xs:keyref>
<xs:unique name="runIdChecker">
<xs:selector xpath="runner"/>
<xs:field xpath="@primaryKey"/>
</xs:unique>
<xs:unique name="oneToOneChecker">
<xs:selector xpath="runner/predecessor"/>
<xs:field xpath="@foreignKey"/>
</xs:unique>
<xs:key name="runKey">
<xs:selector xpath="runner"/>
<xs:field xpath="@primaryKey"/>
</xs:key>
</xs:element>
<xs:complexType name="runnerType">
<xs:sequence>
<xs:element name="firstName" type="xs:string"/>
<xs:element name="lastName" type="xs:string"/>
<xs:element name="predecessor" type="predecessorType" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="primaryKey" type="xs:long" use="required"/>
</xs:complexType>
<xs:complexType name="predecessorType">
<xs:attribute name="foreignKey" type="xs:long" use="required"/>
</xs:complexType>
</xs:schema>
XSD正常工作,但是当我们编写2个类似的primaryKey时它应该会产生错误,而事实并非如此。
另一方面,如果我将头改为:
<xs:schema id="Race"
xmlns:xs = "http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
它会起作用。但出于与我的全球项目一致的原因,我无法改变头脑,需要定义XSD之间的连接 - &gt; XML等同于第一个代码。
有没有人知道我的问题是什么以及我能做些什么?
由于
本杰明
答案 0 :(得分:2)
查看this answer,特别是当您的架构以命名空间为目标时,需要为选择器和字段使用名称空间前缀的部分。
所以,您需要做的就是添加xmlns:my =“myrace.org/”,然后将选择器更改为my:runner/my:predecessor
之类的内容 - 它会起作用。属性不合格,因此您不必担心它们。
我没有将您的约束视为正确性,但如果您遇到问题,请更新帖子。