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>

上一篇:echo() print() printf() print_r() 的区别


下一篇:LeetCode: Distinct Subsequences [115]