2010-12-01 58 views
0

我正在使用JAXB註釋和schemagen maven插件來創建一個xsd。我需要使用wsdl2py處理該xsd以創建Python的客戶端。但正如我在我的班有繼承,schemagen創造這樣的事情:如何在使用JAXB schemagen時避免繼承?

<xs:complexType name="b"> 
    <xs:complexContent> 
    <xs:extension base="a"> 
     <xs:sequence> 
     <xs:element name="field1" type="xs:string"/> 
     </xs:sequence> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

類:

class B extends A{ 
    @XmlElement(required="true") 
    private String field1; 
} 

的問題是,wsdl2py不明白的xs:複雜內容和xs:擴展。所以我想生成沒有繼承的xsd。

在此先感謝

回答

0

這是wsdl2py一個缺點而不是JAXB,但它是如此容易解決,使用XSLT或XQuery。一個快速的嘗試在XSLT解決這個問題:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsl:template match="xsd:complexType[xsd:complexContent/xsd:extension]"> 

     <xsd:complexType> 
      <xsl:apply-templates select="@*" /> 
      <xsl:apply-templates select="xsd:annotation" /> 

      <xsd:sequence> 

       <xsl:variable name="typeQName" select="string(xsd:complexContent/xsd:extension/@base)" /> 
       <xsl:variable name="typeName"><xsl:choose> 
         <xsl:when test="contains($typeQName, ':')"> 
          <xsl:value-of select="substring-after($typeQName, ':')" /> 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:value-of select="$typeQName" /> 
         </xsl:otherwise> 
        </xsl:choose></xsl:variable> 
       <xsl:comment>Included from <xsl:value-of select="$typeQName" />): 
       </xsl:comment> 
       <xsl:apply-templates select="//xsd:complexType[@name=$typeName]/*" /> 
       <xsl:comment>Original extension:</xsl:comment> 
       <xsl:apply-templates select="xsd:complexContent/xsd:extension/*" /> 
      </xsd:sequence> 

      <xsl:apply-templates 
       select="xsd:attribute | xsd:attributeGroup | xsd:attributeGroup" /> 
     </xsd:complexType> 

    </xsl:template> 

    <!-- General copy rule --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*" /> 
      <xsl:apply-templates /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

有兩點要注意:這僅適用於擴展,而不是限制的作品,並使用嵌套序列wsdl2py可能還是不支持(應該是很容易解決)。 目前,它只支持內容模型,但可以很容易地擴展到複製屬性和屬性組。

此外,樣式表僅在擴展元素與基底位於同一模式文件中時才起作用。

祝你好運!