如果有这个的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>