2013-10-29 73 views
1

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

<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更改为“unbounded”)。

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

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

所以基本上我正在寻找一种引用这种类型的类型正在关注基数,如果这是有道理的。

回答

0

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

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

如果您对任何替代方法感兴趣,请适当标记问题。

1

我建议你模块化的xyType的部分尽可能地跨两种类型的共享,说xyType_A,只允许一个xyxyType_B允许的xy秒的无限数量。 (当然,选择在语义上合适的名称,而不是这些替身。)

例如,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> 

如果不同基数的元素在定义层次结构中更深一些,则原则(如果不是机会的数量级)将是相同的:尽可能多地使用通用定义组件,并重用那些明确定义的类型。