想要编写一个模式来测试一个属性+父节点属性的组合是否唯一。
到目前为止有以下内容
<xs:unique name="specify_req_once_in_traceability_section">
<xs:selector xpath="./artefact/doc/relationship"/>
<xs:field xpath="@parent_sec"/>
</xs:unique>
但如果我尝试使用包含parent_doc ..我得到意外的令牌---我猜测不允许父轴
xml如下所示
<?xml version="1.0" encoding="UTF-8"?>
<root>
<artefact>
<doc parent_doc="fred">
<relationship parent_sec="125"/>
</doc>
<doc parent_doc="geoff">
<relationship parent_sec="119"/>
<relationship parent_sec="118"/>
<relationship parent_sec="117"/>
<relationship parent_sec="118"/>
</doc>
<doc parent_doc="fred">
<relationship parent_sec="125"/>
</doc>
<doc parent_doc="james">
<relationship parent_sec="125"/>
</doc>
</artefact>
</root>
答案 0 :(得分:0)
我在评论中测试了我的假设,它使用了JDK 6中的xerces版本。我稍微简化了模式,但一般结构是相同的:
<强>模式强>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="doc" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="relationship" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="ps" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="pd" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="u1">
<xs:selector xpath="doc"/>
<xs:field xpath="@pd"/>
<xs:field xpath="relationship/@ps" />
</xs:unique>
</xs:element>
</xs:schema>
实例文档
<root>
<doc pd="fred">
<relationship ps="125" />
</doc>
<doc pd="geoff">
<relationship ps="119" />
<relationship ps="118" />
<relationship ps="117" />
<relationship ps="118" />
</doc>
<doc pd="fred">
<relationship ps="125" />
</doc>
<doc pd="james">
<relationship ps="125" />
</doc>
</root>
验证时,xerces会给出错误消息:
[错误]:13:28:为元素“root”的身份约束声明的复制唯一值[fred,125]。
如果您将第二个詹姆斯的关系ps更改为126,则文档会正确验证。