2010-12-01 11 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> 

:complexContentをおよびxs:拡張

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

を問題はwsdl2pyは、xsを理解していないということです。だから私は、その継承なしでxsdを生成したいと思います。事前

答えて

0

おかげでこれはかなりJAXBよりwsdl2pyの欠点であるが、それは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がよく、または(修正が容易であるべき)をサポートしていないネストされたシーケンスを使用しています。 現在のところ、コンテンツモデルはサポートされていますが、属性と属性グループのコピーを容易に拡張できます。

また、スタイルシートは、拡張要素がベースと同じスキーマファイルに存在する場合にのみ機能します。

幸運を祈る!

関連する問題