我正在为我之后制作的所有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 Schema key / keyref构造将属性的可能值约束为文档中其他位置的一组属性中使用的值。有关用法示例,请参阅XML Schema key/keyref - how to use them?和答案中的链接,忽略JAXB细节。