为xsd:attributeGroup的属性添加唯一性限制。
目前的myAttr-group看起来像是:
<xsd:attributeGroup name="myAttr">
<xsd:attribute name="**name**" type="xsd:string" use="required"/>
<xsd:attribute name="value" type="xsd:string" use="required"/>
</xsd:attributeGroup>
后来它被用于多个地方,如:
<xsd:complexType name="SomeComplexType">
.
.
<xsd:attributeGroup ref="myAttr"/>
<xsd:attribue name="more-attr" type="xsd:string" use="required"/>
.
.
</xsd:complexType>
.
.
有没有办法在属性级别而不是在元素级别实现唯一性约束?
xml看起来像:
<MyRoot>
.
.
<MyComplexTypeElement **name**="abc" value="rr" more-attr="2">Value 1sdf</MyComplexTypeElement>
<MyComplexTypeElement name="xyz" value="ss" more-attr="22">Value 2asdf</MyComplexTypeElement>
<MyComplexTypeElement name="some" value="rrr" more-attr="2">Value 3asdf</MyComplexTypeElement>
<MyComplexTypeElement name="XYZ" value="rr" more-attr="23" >Value 4sdfs</MyComplexTypeElement>
.
.
</MyRoot>
我使用<xsd:unique>
进行了检查,只能在元素级别实现。
答案 0 :(得分:0)
您必须指定属性组使用的属性值唯一性,而不是定义的。
要使此XML文档有效:
<?xml version="1.0" encoding="utf-8"?>
<MyRoot>
<MyComplexTypeElement name="abc" value="rr" more-attr="2">Value 1sdf</MyComplexTypeElement>
<MyComplexTypeElement name="xyz" value="ss" more-attr="22">Value 2asdf</MyComplexTypeElement>
<MyComplexTypeElement name="some" value="rrr" more-attr="2">Value 3asdf</MyComplexTypeElement>
<MyComplexTypeElement name="XYZ" value="rr" more-attr="23" >Value 4sdfs</MyComplexTypeElement>
</MyRoot>
但由于name
属性值重复,此XML文档无效:
<?xml version="1.0" encoding="utf-8"?>
<MyRoot>
<MyComplexTypeElement name="abc" value="rr" more-attr="2">Value 1sdf</MyComplexTypeElement>
<MyComplexTypeElement name="abc" value="rr" more-attr="2">Value 1sdf</MyComplexTypeElement>
<MyComplexTypeElement name="xyz" value="ss" more-attr="22">Value 2asdf</MyComplexTypeElement>
<MyComplexTypeElement name="some" value="rrr" more-attr="2">Value 3asdf</MyComplexTypeElement>
<MyComplexTypeElement name="XYZ" value="rr" more-attr="23" >Value 4sdfs</MyComplexTypeElement>
</MyRoot>
使用此XSD:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:attributeGroup name="myAttr">
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="value" type="xs:string" use="required"/>
<xs:attribute name="more-attr" type="xs:string" use="required"/>
</xs:attributeGroup>
<xs:element name="MyRoot">
<xs:complexType>
<xs:sequence>
<xs:element name="MyComplexTypeElement" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attributeGroup ref="myAttr"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="UniqueNameAttr">
<xs:selector xpath="MyComplexTypeElement"/>
<xs:field xpath="@name"/>
</xs:unique>
</xs:element>
</xs:schema>
违反唯一性约束会产生错误,例如:
[Error] try.xml:5:61: cvc-identity-constraint.4.1: Duplicate unique value [abc] declared for identity constraint "UniqueNameAttr" of element "MyRoot".
根据OP的评论更新:
我使用了上面的方法,但是在我的xml中违规,我没有看到 错误。我试图在IntelliJ ide中看到 - user1587504
使用已知可靠的基于Xerces的验证解析器测试上述XML和XSD。根据XSD 1.0,你可以指望它是正确的。
要检查的事项:
如果在使用上面的确切示例后仍然没有收到相应的诊断消息,同时证明您可以看到其他验证错误,则可能会怀疑您的工具。但是,非常快速的搜索没有发现使用xs:unique的IntelliJ验证有任何问题。实际上,here is some evidence that IntelliJ does support xs:unique。