XML Schema - 唯一属性值+父属性值

时间:2011-08-30 11:53:44

标签: xml schema unique

想要编写一个模式来测试一个属性+父节点属性的组合是否唯一。

到目前为止有以下内容

<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>

1 个答案:

答案 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,则文档会正确验证。