限制对特定元素组的ID引用

Max*_*Max 9 xml xsd

假设我们有以下架构:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="a_elements">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="a_element" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:attribute name="id" type="xs:ID" use="required"/>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="b_elements">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="b_element" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:attribute name="id" type="xs:ID" use="required"/>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="c_elements">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="c_element" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:attribute name="id" type="xs:ID" use="required"/>
                                <xs:attribute name="ref" type="xs:IDREF" use="required"/>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

这是示例xml文件:

<root>
    <a_elements>
        <a_element id="id1"/>
        <a_element id="id2"/>
    </a_elements>
    <b_elements>
        <b_element id="id3"/>
        <b_element id="id4"/>
    </b_elements>
    <c_elements>
        <c_element id="id5" ref="id1"/>
        <c_element id="id6" ref="id2"/>
    </c_elements>
</root>
Run Code Online (Sandbox Code Playgroud)

因此c_elements可以通过id引用a_elements和b_elements.有可能以某种方式限制ref属性只接受来自一个组的元素的引用,例如a_elements吗?

ken*_*may 7

继我之前的回答,理论上你不能限制使用纯ID/IDREF,但是可以添加满足你要求的身份约束:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">

    <xs:complexType>

      <xs:sequence>
        <xs:element name="a_elements">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="a_element" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="id" type="xs:ID" use="required"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="b_elements">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="b_element" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="id" type="xs:ID" use="required"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="c_elements">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="c_element" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="id" type="xs:ID" use="required"/>
                  <xs:attribute name="ref" type="xs:IDREF" use="required"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    <xs:keyref name="theKeyRef" refer="theKey">
      <xs:selector xpath="c_elements/*"/>
      <xs:field xpath="@ref"/>
    </xs:keyref>
    <xs:key name="theKey">
      <xs:selector xpath="a_elements/*"/>
      <xs:field xpath="@id"/>
    </xs:key>
  </xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)