【问题标题】:how to avoid inheritance when using JAXB schemagen?使用 JAXB schemagen 时如何避免继承?
【发布时间】:2011-05-18 15:27:24
【问题描述】:

我正在使用 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。

提前致谢

【问题讨论】:

    标签: python annotations jaxb2 schemagen


    【解决方案1】:

    这是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 可能支持或不支持的嵌套序列(应该很容易修复)。 目前它只支持内容模型,但可以很容易地扩展为复制属性和attributeGroups。

    此外,样式表仅在扩展元素与基本元素存在于同一架构文件中时才有效。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2019-02-04
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 2010-09-13
      • 2020-02-04
      相关资源
      最近更新 更多