2009-08-04 65 views
1

我正在寻找我的XML模式(XSD)的最佳解决方案。如何实现派生响应(XSD)?

我有一个response

<xs:element name="exampleCatalogResponse"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="meta" type="tns:metaType" /> 
      <xs:element name="data" type="tns:defaultDataType" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

...的defaultDatatype

<xs:complexType name="defaultDataType"> 
    <xs:sequence> 
     <xs:element name="catalog"> 
      <xs:complexType> 
       <xs:sequence maxOccurs="unbounded"> 
        <xs:element name="catalogItem" type="tns:catalogItem" /> 
       </xs:sequence> 
      </xs:complexType> 
      <xs:unique name="itemIdConstraint"> 
       <xs:selector xpath="tns:catalogItem" /> 
       <xs:field xpath="tns:id" /> 
      </xs:unique> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

...和catalogItem

<xs:complexType name="catalogItem"> 
    <xs:sequence> 
     <xs:element name="id" type="xs:nonNegativeInteger" /> 
    </xs:sequence> 
</xs:complexType> 

...但现在有一个专门的项目catalogItem

<xs:complexType name="specialItem"> 
    <xs:complexContent> 
     <xs:extension base="tns:catalogItem"> 
      <xs:sequence> 
       <xs:element name="code" type="xs:string" /> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

现在我需要为我的specialItem专门Response回答其预计这一specialItem请求。

如何才能认识到这一点,而无需另外编写defaultDataType,其中只有catalogItem的类型更改为tns:specialItem

+0

这不是严格有必要缩进八。 – 2009-08-04 12:47:39

回答

0

感谢您的窍门13ren,

我用涵摄功能。因此,默认的catalogItem也被用于独特的表达式。现在如果我在xml中使用这个,我可以通过类型指定这个。

<tns:catalogItem xsi:type="tns:specialItem"> 
    <tns:id>0</tns:id> 
    <tns:code>tns:code</tns:code> 
    </tns:catalogItem> 
    <tns:catalogItem xsi:type="tns:specialItem"> 
    <tns:id>1</tns:id> 
    <tns:code>tns:code</tns:code> 
    </tns:catalogItem> 
    <tns:catalogItem> 
    <tns:id>2</tns:id> 
    <tns:code>tns:code</tns:code> 
    </tns:catalogItem> 

所以最后一个项目是默认的,上面两个是专门的项目。这对我很好。

1

我不认为你可以在XSD中强制执行共同发生的约束。在一个谜方案的精神,这里是一个尴尬的方式让你想要的变化副本,而无需手动“写另一defaultDataType”:

  1. 定义模式文档在上面的复合类型没有命名空间。

  2. <include>它在第二个模式文档中,它有一个名称空间 - 这给它的名称空间。我们可以在许多模式文档中做到这一点,每次在不同的名称空间中获取副本。

  3. 在这些模式文档中的每一个扩展catalogItem,以便每个扩展将在其自己的命名空间。

  4. 在最终的模式文档中,包含上述所有内容,并使它们可以替代 - 因此它们都可以用作响应。 (或者,你可以让它们在另一个模式中扩展一些其他Response元素)。

  5. 注意:您将需要一种不同的方式来执行itemIdConstraint约束,该约束通过名称空间。不速之客,我不知道这是否可能。

这是通过使defaultDataType的不同副本各一个,如果你真正希望他们都这么行不通使用相同的defaultDataType。就像我说的那样,它很尴尬,但这是我能看到做你想做的唯一方法。我提供它作为一种谜题解决方案,而不是实际的解决方案!

相关问题