svcutil 生成代理类时的问题

如果有这个的xsd, group内嵌choice的结构:

<xs:complexType name="CreateType">
        <xs:sequence>
               <xs:group ref="NameChoicesGroup" />
               <xs:element name="Info" type="InfoType" />
        </xs:sequence>
</xs:complexType>

<xs:group name="NameChoicesGroup">
        <xs:choice>
                <xs:element name="NameID" type="IDType"/>
                <xs:element name="Name" type="xs:string"/>
        </xs:choice>
</xs:group>

 

使用svcutil 生成后的结果是:

public class CreateType

{

  int NameID

      string Name

}

因为是choice 类型,这个结果显然不能表示choice的特点,bug?

 

解决问题:

生成前,使用xslt 把所有的group替换成实际的内容, 生成结果:

public class CreateType

{

    [System.Xml.Serialization.XmlElementAttribute("NameID", typeof(uint), Order = 0)]

    [System.Xml.Serialization.XmlElementAttribute("Name", typeof(string), Order = 0)]

 

    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")] 

 

     object Name {...}

}

 

xslt:

<xsl:stylesheetversion="1.0" xmlns:xsl=http://www.w3.org/1999/XSL/Transform" xmlns:xs=http://www.w3.org/2001/XMLSchema>

<xsl:outputmethod="xml"indent="yes"/>

<xsl:keyname="Groups"match="xs:group[@name='NameChoicesGroup']"use="@name"/>

 <xsl:templatematch="xs:group[@ref='NameChoicesGroup']">

<xsl:comment> 

Begin

<xsl:value-ofselect="@ref"/>

</xsl:comment><xsl:variablename="Temp"select="key('Groups', 'NameChoicesGroup')"/>

<xsl:copy-ofselect="$Temp/xs:choice"/>

<xsl:comment> 

 End

<xsl:value-ofselect="@ref"/>

</xsl:comment>

</xsl:template>

<xsl:templatematch="@*|node()">

<xsl:copy>

<xsl:apply-templatesselect="@*|node()" />

</xsl:copy>

</xsl:template>

</xsl:stylesheet>

 

转载于:https://www.cnblogs.com/DataFlow/p/4187286.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值