XSD 独特:为什么 field/@xpath="."不行?
XSD unique: why does field/@xpath="." not work?
我在使用 XSD 验证 XML 中的一些唯一约束时遇到问题。 (我正在使用 XMLlint 进行验证)我有以下结构:
<xsd:element name="elem" type="elemType" >
<xsd:unique name="uniqueJob">
<xsd:selector xpath=".//jobs/job"/>
<xsd:field xpath="."/>
</xsd:unique>
</xsd:element>
Jobs 的复杂类型深深嵌套在 <elem>
中(我多次使用 <jobs>
,这就是我在根元素中定义约束的原因):
<xsd:complexType name="jobType">
<xsd:sequence>
<xsd:element name="job" minOccurs="0" maxOccurs="3" />
</xsd:sequence>
</xsd:complexType>
我现在的问题如下:如果我有类似
<jobs>
<job>Programmer</job>
<job>Scientist</job>
</jobs>
它确实以某种方式无法验证。我从 XMLlint 得到以下错误:
Element 'job': The XPath './/jobs/job' of a field of unique identity-constraint 'uniqueJob' does evaluate to a node of non-simple type.
但是 'job' 是一个简单的类型。我在这里缺少什么?
提前致谢!
PS:我想在每个 <jobs>
标签中实现每个作业都是唯一的。
改变
<xsd:selector xpath=".//jobs/job"/>
<xsd:field xpath="."/>
到
<xsd:selector xpath=".//jobs"/>
<xsd:field xpath="job"/>
说明
前者要求job
元素在自身范围内是唯一的——无论如何总是正确的。
后者要求 job
元素在其父 jobs
元素的范围内是唯一的——可能是您的实际意图。
另见
- Where to place xs:unique constraint in XSD?
我在使用 XSD 验证 XML 中的一些唯一约束时遇到问题。 (我正在使用 XMLlint 进行验证)我有以下结构:
<xsd:element name="elem" type="elemType" >
<xsd:unique name="uniqueJob">
<xsd:selector xpath=".//jobs/job"/>
<xsd:field xpath="."/>
</xsd:unique>
</xsd:element>
Jobs 的复杂类型深深嵌套在 <elem>
中(我多次使用 <jobs>
,这就是我在根元素中定义约束的原因):
<xsd:complexType name="jobType">
<xsd:sequence>
<xsd:element name="job" minOccurs="0" maxOccurs="3" />
</xsd:sequence>
</xsd:complexType>
我现在的问题如下:如果我有类似
<jobs>
<job>Programmer</job>
<job>Scientist</job>
</jobs>
它确实以某种方式无法验证。我从 XMLlint 得到以下错误:
Element 'job': The XPath './/jobs/job' of a field of unique identity-constraint 'uniqueJob' does evaluate to a node of non-simple type.
但是 'job' 是一个简单的类型。我在这里缺少什么?
提前致谢!
PS:我想在每个 <jobs>
标签中实现每个作业都是唯一的。
改变
<xsd:selector xpath=".//jobs/job"/>
<xsd:field xpath="."/>
到
<xsd:selector xpath=".//jobs"/>
<xsd:field xpath="job"/>
说明
前者要求
job
元素在自身范围内是唯一的——无论如何总是正确的。后者要求
job
元素在其父jobs
元素的范围内是唯一的——可能是您的实际意图。
另见
- Where to place xs:unique constraint in XSD?