在我的 XML 架构中引用另一个标签

Reference another tag in my XML Schema

我正在为事后制作的所有 XML 设计一个 XSD 架构。我知道我应该先做这件事,但我对它有点陌生。到目前为止,我所有的 XML 都为我的应用程序创造了奇迹,我也只是想对其进行一些良好的验证。

这是我想要的一个简单示例。

<fields>
  <field id="name" type="text">
   <display>Somethings Name</display>
   <description>The name of the something.</description>
  </field>
</fields>
<forms>
  <form id="custom_form">
    <widgets>
      <widget type="text-input">
        <field id="name"/>
      </widget>
    </widgets>
  </form>
</forms>

这里是 XSD 我有的简化示例:

<xs:sequence>
  <xs:element name="fields" minOccurs="1" maxOccurs="1">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="field" type="fieldType"
          minOccurs="1" maxOccurs="unbounded">
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="forms" maxOccurs="1" minOccurs="1">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="form" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="widgets" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="widget" minOccurs="1" maxOccurs="unbounded">
                      <!-- What do I put here to reference a field? -->
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:sequence>

我的主要问题是如何告诉 XSD 模式 widget 节点中的元素是对其上方 fields 节点中定义的字段之一的引用?现在我只是使用代码来进行验证。

这种场景下应该如何定义字段节点?我是否应该简单地定义 field 节点两次,一次用于主要定义,一次用于引用小部件节点中的字段?

我还看到有一个选项可以重新定义 XSD 中的节点。我是否应该定义主 field 定义,然后将其重新定义为小部件的引用样式节点?我怎么会这样做?

对于这种情况下常见或流行的内容有什么建议吗?

您可以使用 XML 架构 key/keyref 构造将属性的可能值限制为在文档其他位置的一组属性中使用的值。请参阅 XML Schema key/keyref - how to use them? 和答案中的链接以获取使用示例,忽略 JAXB 细节。