2010-12-01 3 views
0

저는 xsd를 만들기 위해 JAXB annotations와 schemagen maven plugin을 사용하고 있습니다. xsd를 wsdl2py로 처리하여 파이썬 클라이언트를 생성해야합니다. complexContent 및 XS : 확장을JAXB schemagen 사용시 상속을 피하는 방법은 무엇입니까?

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

문제는 wsdl2py는 XS을 이해하지 않는다는 것입니다 : 클래스

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

: 내 클래스에서 상속을하지만,에서는 schemagen는 다음과 같이 만듭니다. 그래서 그 상속없이 xsd를 생성하고 싶습니다. 사전

답변

0

에서

덕분에이 오히려 JAXB보다는 wsdl2py의 단점이지만, XSLT 또는 XQuery를 사용하여 해결하기 위해 매우 간단합니다. 확장하지 제한 사항이 단지 작품을하고 wsdl2py가 또는 지원하지 않을 수 있습니다 중첩 순서를 (쉽게 고칠 수 있어야한다) 사용

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

노트의 몇 : 빠른 시도는 XSLT에서이 문제를 해결합니다. 현재는 콘텐츠 모델 만 지원하지만 쉽게 특성 및 특성 그룹을 복사 할 수 있습니다.

또한 스타일 시트는 기본 요소와 동일한 스키마 파일에 확장 요소가있는 경우에만 작동합니다.

행운을 빈다.