为xsd:attributeGroup的属性添加唯一性限制

时间:2013-11-21 11:04:25

标签: xml intellij-idea xsd xml-validation

为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>进行了检查,只能在元素级别实现。

1 个答案:

答案 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,你可以指望它是正确的。

要检查的事项:

  1. 首先使用确切的示例,然后再修改为您的 特殊情况,以排除错误的可能性 在概念的应用中被引入。
  2. 确保XSD与XML相关联。作为一个 完整性检查,将XML的根元素更改为不在的元素 XSD和检查您是否发现了验证错误
  3. 如果在使用上面的确切示例后仍然没有收到相应的诊断消息,同时证明您可以看到其他验证错误,则可能会怀疑您的工具。但是,非常快速的搜索没有发现使用xs:unique的IntelliJ验证有任何问题。实际上,here is some evidence that IntelliJ does support xs:unique