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

时间:2011-11-15 19:37:14

标签: 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>

这是示例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>

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

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

我不知道使用ID和IDREF执行此操作的任何机制。按设计ID和IDREF引用文档中的所有标记。

也就是说,您可以通过某种方式解决这个问题 - 可能对数据结构的任何进程都有验证规则。例如,使用Xpath表达式执行此操作相当容易。你当然可以使用Schematron断言来实现这一点。这里有一个例子:http://zvon.org/xxl/SchematronTutorial/Examples/Example16/example.html

希望这有帮助。

答案 2 :(得分:0)

如果您使用的是XSD 1.0,则kennethmay提供的解决方案可能无效。例如,我正在使用visual studio 2015编辑器并指向让我们说b的元素(例如)未被识别为错误。我想这只适用于XSD 1.1版