在我的XML Schema中引用另一个标记

问题描述 投票:0回答:1

我正在为我之后制作的所有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 xsd xsd-validation
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.