2010-12-01 10 views
0

Ich benutze JAXB Annotationen und schemagen Maven Plugin, um ein xsd zu erstellen. Ich muss diese xsd mit wsdl2py verarbeiten, um einen Python-Client zu erstellen. Aber wie ich Erbschaft in meinen Klassen haben, schafft schemagen etwas wie folgt aus:Wie vermeidet man die Vererbung bei der Verwendung von JAXB-Schemata?

<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> 

für Klasse:

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

Das Problem ist, dass wsdl2py nicht versteht, xs: complex und xs: Erweiterung. Also möchte ich das xsd ohne diese Vererbung generieren.

Vielen Dank im Voraus

Antwort

0

Dies ist ein Manko der wsdl2py statt JAXB, aber es ist so einfach zu beheben, XSLT oder XQuery verwenden. Ein kurzer Versuch, dies in XSLT zu beheben:

<?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> 

Ein paar Anmerkungen: Dies funktioniert nur für die Erweiterung, keine Beschränkungen, und verwendet eine verschachtelte Sequenz, die wsdl2py kann oder nicht (sollte leicht zu beheben) unterstützen. Derzeit unterstützt es nur das Inhaltsmodell, kann aber leicht auf Attribute und Attributgruppen erweitert werden.

Das Stylesheet funktioniert auch nur, wenn das erweiterte Element in derselben Schemadatei wie die Basis existiert.

Viel Glück!

Verwandte Themen