【问题标题】:XSD Unique Constraint of elements in different sequences不同序列中元素的 XSD 唯一约束
【发布时间】:2017-02-23 20:46:50
【问题描述】:

我已经关注 xsd Schema 文件:

   <?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
  <xsd:element name="Config">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Modul">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element maxOccurs="unbounded" name="Content1">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element maxOccurs="unbounded" name="Content2">
                      <xsd:complexType>
                        <xsd:sequence>
                          <xsd:element name="AttributeType1">
                            <xsd:complexType>
                              <xsd:attribute name="X" type="xsd:double" use="required" />
                            </xsd:complexType>
                          </xsd:element>
                          <xsd:element name="AttributeType1">
                            <xsd:complexType>
                              <xsd:attribute name="X" type="xsd:double" use="required" />
                            </xsd:complexType>
                          </xsd:element>
                        </xsd:sequence>
                        <xsd:attribute name="Name" type="xsd:string" use="required" />
                      </xsd:complexType>
                    </xsd:element>
                  </xsd:sequence>
                  <xsd:attribute name="Name" type="xsd:string" use="required" />
                </xsd:complexType>
                <xsd:unique name="Content2NameUniqueKey">
                  <xsd:selector xpath="Content2" />
                  <xsd:field xpath="@Name" />
               </xsd:unique>
              </xsd:element>
            </xsd:sequence>
            <xsd:attribute name="Name" type="xsd:string" use="required" />
           </xsd:complexType>
          <xsd:unique name="Content1NameUniqueKey">
            <xsd:selector xpath="Content1" />
            <xsd:field xpath="@Name" />
          </xsd:unique>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xs:schema>

通过唯一约束,我可以检查 content1 名称是否唯一,以及 content1 元素中的所有 content2 名称是否都是唯一的。

但我的问题是,我想检查是否所有 content2 元素在所有 content1 元素中都是唯一的。因此,完整的 XML 文件中只能有一个名为“xy”的 content1 元素。

有人可以帮帮我吗?

向大家问好!

【问题讨论】:

    标签: xml xsd unique


    【解决方案1】:

    Content2 的唯一元素应该在Modul 中简单地移动一级,使用 XPath Content1/Content2。这样,Content2 元素在整个Modul 中也必须是唯一的。

    AttributeType1 重复出现还有另一个问题,我将其替换为 min/maxOccurs=2,但这可能只是一个错字。

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema"     xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
      <xsd:element name="Config">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="Modul">
              <xsd:complexType>
                <xsd:sequence>
                  <xsd:element maxOccurs="unbounded" name="Content1">
                    <xsd:complexType>
                      <xsd:sequence>
                        <xsd:element maxOccurs="unbounded" name="Content2">
                          <xsd:complexType>
                            <xsd:sequence>
                              <xsd:element name="AttributeType1" maxOccurs="2" minOccurs="2">
                                <xsd:complexType>
                                  <xsd:attribute name="X" type="xsd:double" use="required" />
                                </xsd:complexType>
                              </xsd:element>
                            </xsd:sequence>
                            <xsd:attribute name="Name" type="xsd:string" use="required" />
                          </xsd:complexType>
                        </xsd:element>
                      </xsd:sequence>
                      <xsd:attribute name="Name" type="xsd:string" use="required" />
                    </xsd:complexType>
                  </xsd:element>
                </xsd:sequence>
                <xsd:attribute name="Name" type="xsd:string" use="required" />
              </xsd:complexType>
              <xsd:unique name="Content1NameUniqueKey">
                <xsd:selector xpath="Content1" />
                <xsd:field xpath="@Name" />
              </xsd:unique>
              <xsd:unique name="Content2NameUniqueKey">
                <xsd:selector xpath="Content1/Content2" />
                <xsd:field xpath="@Name" />
              </xsd:unique>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xs:schema>
    

    【讨论】:

    • @MrPink:如果有帮助,请accept这个答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-01-10
    • 2013-08-20
    • 2012-05-08
    • 2013-01-18
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多