我为我之后制作的所有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>
&#13;
以下是我所拥有的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>
&#13;
我的主要问题是如何告诉XSD架构widget
节点中的元素是对其上方fields
节点中定义的字段之一的引用?现在我只是使用代码进行验证。
如何在此场景中定义字段节点?我应该简单地定义field
节点两次,一个用于主要定义,一个用于引用小部件节点中的字段?
我还看到了可以选择在XSD中重新定义节点。我是否可以定义主field
定义然后将其重新定义为小部件的引用样式节点?我怎么会这样做?
对于此方案的常见或流行的任何建议?
答案 0 :(得分:1)
您可以使用XML Schema key / keyref构造将属性的可能值约束为文档中其他位置的一组属性中使用的值。请参阅XML Schema key/keyref - how to use them?以及答案中的使用示例链接,忽略JAXB细节。