2010-12-01 28 views
0

J'utilise les annotations JAXB et le plugin schemagen maven pour créer un fichier xsd. J'ai besoin de traiter ce fichier xsd avec wsdl2py pour créer un client Python. Mais comme je l'ai héritage dans mes classes, schemagen crée quelque chose comme ceci:comment éviter l'héritage lors de l'utilisation de 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> 

pour la classe:

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

Le problème est que wsdl2py ne comprend pas xs: complexContent et xs: l'extension. Donc, je voudrais générer le xsd sans cet héritage.

Merci à l'avance

Répondre

0

Ceci est une lacune de wsdl2py plutôt que JAXB, mais il est si facile à corriger, en utilisant XSLT ou XQuery. Une tentative rapide de résoudre ce problème en 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> 

Quelques notes: Cela ne fonctionne que pour l'extension, pas de restrictions, et utilise une séquence imbriquée qui wsdl2py peut ou non supporter (devrait être facile à fixer). Actuellement, il ne prend en charge que le modèle de contenu, mais pourrait facilement être étendu pour copier des attributs et des groupes d'attributs. En outre, la feuille de style ne fonctionne que lorsque l'élément étendu existe dans le même fichier de schéma que la base.

Bonne chance!