【问题标题】:Restrict ID references to a particular element group限制对特定元素组的 ID 引用
【发布时间】:2016-11-16 12:37:58
【问题描述】:

假设我们有以下架构:

<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?

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    关于我之前的回答,理论上你不能限制使用纯粹的 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>
    

    【讨论】:

    • 这似乎是我要找的。谢谢!
    【解决方案2】:

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

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

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      如果您使用的是 XSD 1.0,kenneth 给出的解决方案可能不起作用。例如,我正在使用 Visual Studio 2015 编辑器并指向假设 b 的元素(例如 )未被识别为错误。我猜这仅适用于 XSD 1.1 版

      【讨论】:

        猜你喜欢
        • 2021-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-17
        • 2023-01-08
        • 1970-01-01
        • 2019-06-23
        相关资源
        最近更新 更多