考虑以下xml:
<Awesome xs:type="AB">
<a />
<b />
</Awesome>
<Awesome xs:type="CD">
<f />
<c />
<e />
<d />
</Awesome>
可以使用此架构指定:
<xs:complexType name="base" abstract="true" />
<xs:complexType name="AB">
<xs:complexContent>
<xs:extension base="base">
<xs:all>
<xs:element name="a" />
<xs:element name="b" />
</xs:all>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="CD">
<xs:complexContent>
<xs:extension base="base">
<xs:all>
<xs:element name="c" />
<xs:element name="d" />
<xs:element name="e" />
<xs:element name="f" />
</xs:all>
</xs:extension>
</xs:complexContent>
</xs:complexType>
考虑到架构的潜在用户,我想让xml尽可能简单(这就是我使用all
而不是sequence
)并且更喜欢摆脱{ {1}}属性。
可以在架构中指定吗?也许采用不同的方法?
答案 0 :(得分:1)
编写XSD(对用户来说最简单的事情,这里说的)最简单的方法是遵循以下原则:如果需要一个Awesome元素来包含a
和b
,另一个需要包含一些c
,d
,e
和f
的序列,那么它们不是同一类,应该有不同的名称。
如果你称它们为Awesome-ab和Awesome-cdef,那么架构是微不足道的,用户很容易理解何时允许他们使用a
和b
作为孩子以及何时使用其他元素。
xsi:type
机制被精确地添加到词汇表设计者想要使用相同名称调用不同内容但仍然针对不同类型验证它们的情况。
如果您不想为不同类型的元素使用不同的名称,并且您不想使用xsi:type
来表示类型的差异,那么您如何建议验证者应该知道哪个要使用的类型?千里眼将是一个很好的方法,但我知道它很难实现。