复杂类型的向量

时间:2013-10-29 15:08:23

标签: xsd

有没有办法在引用该类型的地方定义类型的基数?

<xs:complexType name="xyType">
  <xs:element name="xy" maxOccurs="1">
            <xs:choice maxOccurs="1" minOccurs="0">
                <xs:complexType>
                    <xs:choice maxOccurs="unbounded" minOccurs="0">
                        ...
                    </xs:choice>
                </xs:complexType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

所以例如我有两种类型A和B都有引用这种类型的元素,但是在一种情况下我只允许一个xy(如上所述)而另一种我想允许多个xy(就像我改变了maxOccurs一样)上面的xy到“无界”)。

我不想完全分离xyType(single)和xyType(unbounded)的complexType定义,因为实际上这种类型的定义非常冗长而复杂。

如果可能的话,我也不想定义太多类型(比如将内部complexType与主体分离,并且有两种类型引用该类型)。这在我的特定场景中也会非常复杂(我有一个复杂的类层次结构,我尝试用模式定义,所以一切都已经膨胀)。

所以基本上我正在寻找一种引用这种类型的类型正在关注基数的东西,如果它有意义的话。

2 个答案:

答案 0 :(得分:1)

我建议您尽可能模块化xyType的各个部分,以便分享两种类型,例如xyType_A只允许一个xyxyType_B允许无限数量的xy s。 (当然选择语义上合适的名称而不是这些替身。)

例如,xyType_AxyType_B可能会对xy基数的定义有所不同,但却分享commonType中定义的复杂机制:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="xyType_A">
    <xs:sequence>
      <xs:element name="xy"  type="commonType" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="xyType_B">
    <xs:sequence>
      <xs:element name="xy"  type="commonType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="commonType">
    <xs:choice maxOccurs="1" minOccurs="0">
      <xs:sequence>
        <xs:choice maxOccurs="unbounded" minOccurs="0">
          <!-- further complicated structures continue here -->
        </xs:choice>
        <!-- and here or wherever -->
     </xs:sequence>
    </xs:choice>
  </xs:complexType>

</xs:schema>

如果不同基数的元素在定义层次结构中更深,则原则(如果不是机会的大小)将是相同的:尽可能多地考虑常见的定义组件,并在明确定义的类型中重用它们。

答案 1 :(得分:0)

这在XSD 1.0中不起作用。您可以使用Schematron(在XSD 1.0之上);它没有任何问题。

可以在XSD 1.1中使用。这需要一些工作,至少基于我的理解。解决方案是使用断言;但是,它们似乎只支持复杂和简单的类型,这意味着您可能仍需要引入两个特定于元素A和B的新类型;但是,它们只是扩展xyType(100%重用),目的是提供一个定义特定于A和B的断言的位置。

如果您对其中任何一种选择感兴趣,请适当标记问题。