0

考虑以下 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)并且更喜欢摆脱xs:type属性。

这可以在模式中指定吗?也许用不同的方法?

4

1 回答 1

1

编写 XSD 最简单的事情(对于用户来说也是最简单的事情,它在这里说)是遵循这样的原则,即如果一个 Awesome 元素需要包含 ana和 a b,而另一个需要包含一些、、 和的序列c,那么它们不是同一种东西,应该有不同的名称。def

如果你称它们为 Awesome-ab 和 Awesome-cdef,那么架构是微不足道的,用户很容易理解他们何时被允许使用a,何时允许使用b,何时使用其他元素。

xsi:type机制是针对词汇设计者希望用相同名称调用不同事物但仍针对不同类型验证它们的情况而添加的。

如果您不想为不同类型的元素使用不同的名称,并且您不想用不同的名称来表示类型的差异,您xsi:type如何建议验证器应该知道使用哪种类型?千里眼将是一个很好的方法,但我知道它很难实施。

于 2013-08-23T18:26:48.897 回答