我正在使用JAXB注释和schemagen maven插件来创建xsd。我需要使用wsdl2py处理xsd以创建Python的客户端。但是因为我在我的类中有继承,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。
提前致谢
答案 0 :(得分: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
可能支持或不支持的嵌套序列(应该很容易修复)。
目前,它仅支持内容模型,但可以轻松扩展到复制属性和属性组。
此外,样式表仅在扩展元素存在于与基础相同的模式文件中时才有效。
祝你好运!