0

JAXB アノテーションと schemagen maven プラグインを使用して xsd を作成しています。Python のクライアントを作成するには、その xsd を wsdl2py で処理する必要があります。しかし、クラスに継承があるため、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:complexContent と xs:extension を理解できないことです。したがって、その継承なしで xsd を生成したいと思います。

前もって感謝します

4

1 に答える 1

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サポートされているかどうかに関係なくネストされたシーケンスを使用します(簡単に修正できるはずです)。現在、コンテンツモデルのみをサポートしていますが、属性と属性グループをコピーするように簡単に拡張できます。

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

幸運を!

于 2011-01-09T13:38:41.030 に答える