2014-08-13 10:39:27 +01:00
<?xml version="1.0"?>
<!--
mdoc-html-utils.xsl: ECMA-style docs to HTML stylesheet transformation utils
Author: Joshua Tauberer (tauberer@for.net)
Author: Jonathan Pryor (jpryor@novell.com)
This file requires that including files define the following callable
templates:
- CreateCodeBlock (language, content)
- CreateEnumerationTable (content)
- CreateHeader (content)
- CreateListTable (header, content)
- CreateMembersTable (content)
- CreateSignature (content)
- CreateTypeDocumentationTable (content)
- GetLinkTarget (type, cref)
- CreateEditLink (e)
-->
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl"
>
<xsl:import href= "mdoc-html-format.xsl" />
<!-- TEMPLATE PARAMETERS -->
<xsl:param name= "language" select= "'C#'" />
<xsl:param name= "index" />
<xsl:param name= "source-id" />
<xsl:variable name= "ThisType" select= "/Type" />
<!-- The namespace that the current type belongs to. -->
<xsl:variable name= "TypeNamespace" select= "substring(/Type/@FullName, 1, string-length(/Type/@FullName) - string-length(/Type/@Name) - 1)" />
<!-- THE MAIN RENDERING TEMPLATE -->
<!-- TYPE OVERVIEW -->
<xsl:template name= "CreateTypeOverview" >
<xsl:param name= "implemented" />
<xsl:param name= "show-members-link" />
<xsl:attribute name= "id" >
<xsl:text > T:</xsl:text>
<xsl:call-template name= "GetEscapedTypeName" >
<xsl:with-param name= "typename" select= "@FullName" />
</xsl:call-template>
<xsl:text > :Summary</xsl:text>
</xsl:attribute>
<!-- summary -->
<div class= "msummary" >
<xsl:apply-templates select= "Docs/summary" mode= "notoppara" />
<xsl:apply-templates select= "Docs/summary" mode= "editlink" />
</div>
<xsl:if test= "$implemented" >
<p > <b > Mono Implementation Note: </b> </p>
<blockquote >
<xsl:value-of disable-output-escaping= "yes" select= "$implemented" />
</blockquote>
</xsl:if>
<xsl:if test= "$show-members-link and not(Base/BaseTypeName='System.Enum' or Base/BaseTypeName='System.Delegate' or Base/BaseTypeName='System.MulticastDelegate') and count(Members)" >
<p >
See Also:
<a >
<xsl:attribute name= "href" >
<xsl:text > T</xsl:text>
<xsl:call-template name= "GetLinkId" >
<xsl:with-param name= "type" select= "." />
<xsl:with-param name= "member" select= "." />
</xsl:call-template>
<xsl:text > /*</xsl:text>
</xsl:attribute>
<xsl:value-of select= "translate(@Name, '+', '.')" />
<xsl:value-of select= "' '" />
<xsl:text > Members</xsl:text>
</a>
</p>
</xsl:if>
<!--
Inheritance tree, but only for non-standard classes and not for interfaces
-->
<xsl:if test= "not(Base/BaseTypeName='System.Enum' or Base/BaseTypeName='System.Delegate' or Base/BaseTypeName='System.ValueType' or Base/BaseTypeName='System.Object' or Base/BaseTypeName='System.MulticatDelegate' or count(Base/ParentType)=0)" >
<p >
<xsl:for-each select= "Base/ParentType" >
<xsl:sort select= "@Order" order= "descending" />
<xsl:variable name= "p" select= "position()" />
<xsl:for-each select= "parent::Base/ParentType[position() < $p]" >
<xsl:value-of select= "'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'" disable-output-escaping= "yes" />
</xsl:for-each>
<a >
<xsl:attribute name= "href" >
<xsl:call-template name= "GetLinkTargetHtml" >
<xsl:with-param name= "type" select= "@Type" />
<xsl:with-param name= "cref" >
<xsl:text > T:</xsl:text>
<xsl:call-template name= "GetEscapedTypeName" >
<xsl:with-param name= "typename" select= "@Type" />
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:attribute>
<xsl:value-of select= "@Type" />
</a>
<br />
</xsl:for-each>
<xsl:for-each select= "Base/ParentType" >
<xsl:value-of select= "'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'" disable-output-escaping= "yes" />
</xsl:for-each>
<xsl:value-of select= "@FullName" />
</p>
</xsl:if>
<!--
<xsl:if test= "Base/BaseTypeName='System.Enum'" >
<br />
The type of the values in this enumeration is
<xsl:apply-templates select= "Members/Member[@MemberName='value__']/ReturnValue/ReturnType" mode= "typelink" > <xsl:with-param name= "wrt" select= "$TypeNamespace" /> </xsl:apply-templates> .
</xsl:if>
-->
</xsl:template>
<xsl:template name= "CreateTypeSignature" >
<xsl:call-template name= "CreateSignature" >
<xsl:with-param name= "id" >
<xsl:text > T:</xsl:text>
<xsl:call-template name= "GetEscapedTypeName" >
<xsl:with-param name= "typename" select= "@FullName" />
</xsl:call-template>
<xsl:text > :Signature</xsl:text>
</xsl:with-param>
<xsl:with-param name= "content" >
<!-- signature -->
<xsl:choose >
<xsl:when test= "$language='C#'" >
<xsl:for-each select= "Attributes/Attribute" >
<xsl:text > [</xsl:text>
<xsl:value-of select= "AttributeName" />
<xsl:text > ]</xsl:text>
<br />
</xsl:for-each>
<xsl:for-each select= "ReturnValue/Attributes/Attribute" >
<xsl:text > [return:</xsl:text>
<xsl:value-of select= "AttributeName" />
<xsl:text > ]</xsl:text>
<br />
</xsl:for-each>
<xsl:choose >
<xsl:when test= "Base/BaseTypeName='System.Enum'" >
<xsl:call-template name= "getmodifiers" >
<xsl:with-param name= "sig" select= "TypeSignature[@Language='C#']/@Value" />
</xsl:call-template>
<xsl:text > enum </xsl:text>
<!-- member name, argument list -->
<b >
<xsl:value-of select= "translate (@Name, '+', '.')" />
</b>
</xsl:when>
<xsl:when test= "Base/BaseTypeName='System.Delegate' or Base/BaseTypeName='System.MulticastDelegate'" >
<xsl:choose >
<xsl:when test= "count(Parameters) > 0 and count(ReturnValue) > 0" >
<!-- Only recreate the delegate signature if the appropriate information
is present in the XML file. -->
<xsl:call-template name= "getmodifiers" >
<xsl:with-param name= "sig" select= "TypeSignature[@Language='C#']/@Value" />
</xsl:call-template>
<xsl:text > delegate </xsl:text>
<xsl:apply-templates select= "ReturnValue/ReturnType" mode= "typelink" > <xsl:with-param name= "wrt" select= "$TypeNamespace" /> </xsl:apply-templates>
<!-- hard space -->
<xsl:value-of select= "' '" />
<!-- member name, argument list -->
<b >
<xsl:call-template name= "GetDefinitionName" >
<xsl:with-param name= "name" select= "translate (@Name, '+', '.')" />
<xsl:with-param name= "TypeParameters" select= "TypeParameters" />
</xsl:call-template>
</b>
<!-- hard space -->
<xsl:value-of select= "' '" />
<xsl:value-of select= "'('" /> <!-- prevents whitespace issues -->
<xsl:for-each select= "Parameters/Parameter" >
<xsl:call-template name= "ShowParameter" >
<xsl:with-param name= "Param" select= "." />
<xsl:with-param name= "TypeNamespace" select= "$TypeNamespace" />
</xsl:call-template>
<xsl:if test= "not(position()=last())" > , </xsl:if>
</xsl:for-each>
<xsl:value-of select= "')'" />
</xsl:when>
<xsl:otherwise >
<xsl:apply-templates select= "TypeSignature[@Language=$language]/@Value" />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise >
<xsl:call-template name= "getmodifiers" >
<xsl:with-param name= "sig" select= "TypeSignature[@Language='C#']/@Value" />
<xsl:with-param name= "typetype" select= "true()" />
</xsl:call-template>
<xsl:value-of select= "' '" />
<b >
<xsl:call-template name= "GetDefinitionName" >
<xsl:with-param name= "name" select= "translate (@Name, '+', '.')" />
<xsl:with-param name= "TypeParameters" select= "TypeParameters" />
</xsl:call-template>
</b>
<xsl:variable name= "HasStandardBaseType" select= "Base/BaseTypeName='System.Object' or Base/BaseTypeName='System.ValueType'" />
<xsl:variable name= "HasBaseType" select= "count(Base/BaseTypeName)>0" />
<xsl:if test= "(($HasBaseType) and not($HasStandardBaseType)) or not(count(Interfaces/Interface)=0)" >
<xsl:text > : </xsl:text>
<xsl:if test= "$HasBaseType and not($HasStandardBaseType)" >
<xsl:apply-templates select= "Base/BaseTypeName" mode= "typelink" > <xsl:with-param name= "wrt" select= "$TypeNamespace" /> </xsl:apply-templates>
<xsl:if test= "not(count(Interfaces/Interface)=0)" > , </xsl:if>
</xsl:if>
<xsl:for-each select= "Interfaces/Interface" >
<xsl:if test= "not(position()=1)" > , </xsl:if>
<xsl:apply-templates select= "InterfaceName" mode= "typelink" > <xsl:with-param name= "wrt" select= "$TypeNamespace" /> </xsl:apply-templates>
</xsl:for-each>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name= "CreateGenericConstraints" >
<xsl:with-param name= "TypeParameters" select= "TypeParameters" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise >
<xsl:apply-templates select= "TypeSignature[@Language=$language]/@Value" />
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name= "GetDefinitionName" >
<xsl:param name= "name" />
<xsl:param name= "TypeParameters" />
<xsl:choose >
<!-- do NOT process explicitly implemented generic interface members
unless they're actually generic methods. -->
<xsl:when test= "contains ( $ n a m e , ' & g t ; ' ) a n d
'> ' = substring ($name, string-length ($name), 1)">
<xsl:value-of select= "substring-before ($name, '<')" />
<xsl:text > < </xsl:text>
<xsl:for-each select= "$TypeParameters/TypeParameter" >
<xsl:for-each select= "Attributes/Attribute" >
<xsl:text > [</xsl:text>
<xsl:value-of select= "AttributeName" />
<xsl:text > ] </xsl:text>
</xsl:for-each>
<xsl:choose >
<xsl:when test= "@Name" >
<xsl:value-of select= "@Name" />
</xsl:when>
<xsl:otherwise >
<xsl:value-of select= "." />
</xsl:otherwise>
</xsl:choose>
<xsl:if test= "not(position()=last())" > , </xsl:if>
</xsl:for-each>
<xsl:text > > </xsl:text>
</xsl:when>
<xsl:otherwise >
<xsl:value-of select= "$name" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name= "CreateGenericConstraints" >
<xsl:param name= "TypeParameters" />
<xsl:for-each select= "$TypeParameters/TypeParameter" >
<xsl:variable name= "constraintsCount" select= "count(Constraints/*)" />
<xsl:if test= "$constraintsCount > 0 and count(Constraints/*[.='Contravariant' or .='Covariant']) != $constraintsCount" >
<xsl:call-template name= "CreateGenericParameterConstraints" >
<xsl:with-param name= "constraints" select= "Constraints" />
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template name= "CreateGenericParameterConstraints" >
<xsl:param name= "constraints" />
<br />
<xsl:text > where </xsl:text>
<xsl:value-of select= "@Name" />
<xsl:text > : </xsl:text>
<xsl:variable name= "kind"
select="count($constraints[ParameterAttribute='ReferenceTypeConstraint'])+
count($constraints[ParameterAttribute='NotNullableValueTypeConstraint'])" />
<xsl:variable name= "base" select= "count($constraints/BaseTypeName)" />
<xsl:variable name= "iface" select= "count($constraints/InterfaceName)" />
<xsl:variable name= "struct" select= "$constraints/ParameterAttribute='NotNullableValueTypeConstraint'" />
<xsl:if test= "$constraints/ParameterAttribute='ReferenceTypeConstraint'" >
<xsl:text > class</xsl:text>
</xsl:if>
<xsl:if test= "$constraints/ParameterAttribute='NotNullableValueTypeConstraint'" >
<xsl:text > struct</xsl:text>
</xsl:if>
<xsl:if test= "$constraints/BaseTypeName and not($struct)" >
<xsl:if test= "$kind" > , </xsl:if>
<xsl:apply-templates select= "$constraints/BaseTypeName" mode= "typelink" />
</xsl:if>
<xsl:for-each select= "$constraints/InterfaceName" >
<xsl:if test= "position()=1" >
<xsl:if test= "$kind or $base" > , </xsl:if>
</xsl:if>
<xsl:apply-templates select= "." mode= "typelink" />
<xsl:if test= "not(position()=last())" > , </xsl:if>
</xsl:for-each>
<xsl:if test= "$constraints/ParameterAttribute='DefaultConstructorConstraint' and not($struct)" >
<xsl:if test= "$base or $iface" > , </xsl:if>
<xsl:text > new()</xsl:text>
</xsl:if>
</xsl:template>
<xsl:template name= "CreateMemberOverview" >
<xsl:param name= "implemented" />
<div class= "msummary" >
<xsl:apply-templates select= "Docs/summary" mode= "notoppara" />
<xsl:apply-templates select= "Docs/summary" mode= "editlink" />
</div>
<xsl:if test= "$implemented" >
<p > <b > Mono Implementation Note: </b> </p>
<blockquote >
<xsl:value-of disable-output-escaping= "yes" select= "$implemented" />
</blockquote>
</xsl:if>
<!-- member value -->
<xsl:if test= "MemberValue" >
<p > <b > Value: </b>
<xsl:value-of select= "MemberValue" />
</p>
</xsl:if>
</xsl:template>
<xsl:template name= "CreateRelatedSection" >
<xsl:param name= "section" />
<xsl:param name= "type" />
<xsl:if test= "count(Docs/related[@type=$type])" >
<h3 class= "{$type}" > <xsl:value-of select= "$section" /> </h3>
<ul class= "{$type}" >
<xsl:for-each select= "Docs/related[@type=$type]" >
<li > <a href= "{@href}" target= "_blank" > <xsl:value-of select= "." /> </a> </li>
</xsl:for-each>
</ul>
</xsl:if>
</xsl:template>
<xsl:template name= "CreatePlatformRequirements" >
<!-- For now we only have that information in MonoTouch so only process that -->
<xsl:if test= "starts-with(/Type/@FullName, 'MonoTouch')" >
<xsl:choose >
<!-- We first check if we have a [Since] at the member level -->
<xsl:when test= "count(Attributes/Attribute/AttributeName[starts-with(text(), 'MonoTouch.ObjCRuntime.Since')])" >
<b > Minimum iOS version: </b>
<xsl:value-of select= "translate(substring-before (substring-after (Attributes/Attribute/AttributeName[starts-with(text(), 'MonoTouch.ObjCRuntime.Since')], 'MonoTouch.ObjCRuntime.Since('), ')'), ', ', '.')" />
<br />
</xsl:when>
<!-- If not, we then check at the type level -->
<xsl:when test= "count(/Type/Attributes/Attribute/AttributeName[starts-with(text(), 'MonoTouch.ObjCRuntime.Since')])" >
<b > Minimum iOS version: </b>
<xsl:value-of select= "translate(substring-before (substring-after (/Type/Attributes/Attribute/AttributeName[starts-with(text(), 'MonoTouch.ObjCRuntime.Since')], 'MonoTouch.ObjCRuntime.Since('), ')'), ', ', '.')" />
<br />
</xsl:when>
</xsl:choose>
</xsl:if>
</xsl:template>
<xsl:template name= "CreateMemberSignature" >
<xsl:param name= "linkid" select= "''" />
<xsl:call-template name= "CreateSignature" >
<xsl:with-param name= "content" >
<xsl:if test= "contains(MemberSignature[@Language='C#']/@Value,'this[')" >
<p > <i > This is the default property for this class.</i> </p>
</xsl:if>
<!-- recreate the signature -->
<xsl:for-each select= "Attributes/Attribute[AttributeName != 'System.Runtime.CompilerServices.Extension']" >
<xsl:text > [</xsl:text>
<xsl:value-of select= "AttributeName" />
<xsl:text > ]</xsl:text>
<br />
</xsl:for-each>
<xsl:for-each select= "ReturnValue/Attributes/Attribute" >
<xsl:text > [return:</xsl:text>
<xsl:value-of select= "AttributeName" />
<xsl:text > ]</xsl:text>
<br />
</xsl:for-each>
<xsl:call-template name= "getmodifiers" >
<xsl:with-param name= "sig" select= "MemberSignature[@Language='C#']/@Value" />
</xsl:call-template>
<xsl:if test= "MemberType = 'Event'" >
<xsl:text > event </xsl:text>
<xsl:if test= "ReturnValue/ReturnType=''" >
<xsl:value-of select= "substring-before(substring-after(MemberSignature[@Language='C#']/@Value, 'event '), concat(' ', @MemberName))" />
</xsl:if>
</xsl:if>
<!-- return value (comes out "" where not applicable/available) -->
<xsl:choose >
<xsl:when test= "@MemberName='op_Implicit'" >
<xsl:text > implicit operator</xsl:text>
</xsl:when>
<xsl:when test= "@MemberName='op_Explicit'" >
<xsl:text > explicit operator</xsl:text>
</xsl:when>
<xsl:otherwise >
<xsl:apply-templates select= "ReturnValue/ReturnType" mode= "typelink" >
<xsl:with-param name= "wrt" select= "$TypeNamespace" />
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
<!-- hard space -->
<xsl:value-of select= "' '" />
<!-- member name -->
<xsl:choose >
<!-- Constructors get the name of the class -->
<xsl:when test= "MemberType='Constructor'" >
<b >
<xsl:call-template name= "GetConstructorName" >
<xsl:with-param name= "type" select= "../.." />
<xsl:with-param name= "ctor" select= "." />
</xsl:call-template>
</b>
</xsl:when>
<!-- Conversion operators get the return type -->
<xsl:when test= "@MemberName='op_Implicit' or @MemberName='op_Explicit'" >
<xsl:apply-templates select= "ReturnValue/ReturnType" mode= "typelink" >
<xsl:with-param name= "wrt" select= "$TypeNamespace" />
</xsl:apply-templates>
</xsl:when>
<!-- Regular operators get their symbol -->
<xsl:when test= "@MemberName='op_UnaryPlus'" > operator+</xsl:when>
<xsl:when test= "@MemberName='op_UnaryNegation'" > operator-</xsl:when>
<xsl:when test= "@MemberName='op_LogicalNot'" > operator!</xsl:when>
<xsl:when test= "@MemberName='op_OnesComplement'" > operator~</xsl:when>
<xsl:when test= "@MemberName='op_Increment'" > operator++</xsl:when>
<xsl:when test= "@MemberName='op_Decrement'" > operator--</xsl:when>
<xsl:when test= "@MemberName='op_True'" > operator true</xsl:when>
<xsl:when test= "@MemberName='op_False'" > operator false</xsl:when>
<xsl:when test= "@MemberName='op_Addition'" > operator+</xsl:when>
<xsl:when test= "@MemberName='op_Subtraction'" > operator-</xsl:when>
<xsl:when test= "@MemberName='op_Multiply'" > operator*</xsl:when>
<xsl:when test= "@MemberName='op_Division'" > operator/</xsl:when>
<xsl:when test= "@MemberName='op_Modulus'" > operator%</xsl:when>
<xsl:when test= "@MemberName='op_BitwiseAnd'" > operator& </xsl:when>
<xsl:when test= "@MemberName='op_BitwiseOr'" > operator|</xsl:when>
<xsl:when test= "@MemberName='op_ExclusiveOr'" > operator^</xsl:when>
<xsl:when test= "@MemberName='op_LeftShift'" > operator< < </xsl:when>
<xsl:when test= "@MemberName='op_RightShift'" > operator> > </xsl:when>
<xsl:when test= "@MemberName='op_Equality'" > operator==</xsl:when>
<xsl:when test= "@MemberName='op_Inequality'" > operator!=</xsl:when>
<xsl:when test= "@MemberName='op_GreaterThan'" > operator> </xsl:when>
<xsl:when test= "@MemberName='op_LessThan'" > operator< </xsl:when>
<xsl:when test= "@MemberName='op_GreaterThanOrEqual'" > operator> =</xsl:when>
<xsl:when test= "@MemberName='op_LessThanOrEqual'" > operator< =</xsl:when>
<xsl:when test= "MemberType='Property' and count(Parameters/Parameter) > 0" >
<!-- C# only permits indexer properties to have arguments -->
<xsl:text > this</xsl:text>
</xsl:when>
<!-- Everything else just gets its name -->
<xsl:when test= "contains (@MemberName, '<')" >
<b >
<xsl:call-template name= "GetDefinitionName" >
<xsl:with-param name= "name" select= "@MemberName" />
<xsl:with-param name= "TypeParameters" select= "TypeParameters" />
</xsl:call-template>
</b>
</xsl:when>
<xsl:otherwise >
<b > <xsl:value-of select= "@MemberName" /> </b>
</xsl:otherwise>
</xsl:choose>
<!-- hard space -->
<xsl:value-of select= "' '" />
<!-- argument list -->
<xsl:if test= "MemberType='Method' or MemberType='Constructor' or (MemberType='Property' and count(Parameters/Parameter))" >
<xsl:if test= "not(MemberType='Property')" > (</xsl:if>
<xsl:if test= "MemberType='Property'" > [</xsl:if>
<xsl:for-each select= "Parameters/Parameter" >
<xsl:call-template name= "ShowParameter" >
<xsl:with-param name= "Param" select= "." />
<xsl:with-param name= "TypeNamespace" select= "$TypeNamespace" />
</xsl:call-template>
<xsl:if test= "not(position()=last())" > , </xsl:if>
</xsl:for-each>
<xsl:if test= "not(MemberType='Property')" > )</xsl:if>
<xsl:if test= "MemberType='Property'" > ]</xsl:if>
</xsl:if>
<xsl:if test= "MemberType='Property'" >
<xsl:value-of select= "' '" />
<xsl:text > {</xsl:text>
<xsl:value-of select= "substring-before(substring-after(MemberSignature[@Language='C#']/@Value, '{'), '}')" />
<xsl:text > }</xsl:text>
</xsl:if>
<xsl:call-template name= "CreateGenericConstraints" >
<xsl:with-param name= "TypeParameters" select= "TypeParameters" />
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name= "GetConstructorName" >
<xsl:param name= "type" />
<xsl:param name= "ctor" />
<xsl:choose >
<xsl:when test= "contains($type/@Name, '<')" >
<xsl:value-of select= "translate (substring-before ($type/@Name, '<'), '+', '.')" />
</xsl:when>
<xsl:otherwise >
<xsl:value-of select= "translate ($type/@Name, '+', '.')" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name= "ShowParameter" >
<xsl:param name= "Param" />
<xsl:param name= "TypeNamespace" />
<xsl:param name= "prototype" select= "false()" />
<xsl:if test= "not($prototype)" >
<xsl:for-each select= "$Param/Attributes/Attribute[not(Exclude='1') and not(AttributeName='ParamArrayAttribute' or AttributeName='System.ParamArray')]" >
<xsl:text > [</xsl:text>
<xsl:value-of select= "AttributeName" />
<xsl:text > ]</xsl:text>
<xsl:value-of select= "' '" />
</xsl:for-each>
</xsl:if>
<xsl:if test= "count($Param/Attributes/Attribute/AttributeName[.='ParamArrayAttribute' or .='System.ParamArray'])" >
<b > params</b>
<xsl:value-of select= "' '" />
</xsl:if>
<xsl:if test= "$Param/@RefType" >
<i > <xsl:value-of select= "$Param/@RefType" /> </i>
<!-- hard space -->
<xsl:value-of select= "' '" />
</xsl:if>
<!-- parameter type link -->
<xsl:apply-templates select= "$Param/@Type" mode= "typelink" >
<xsl:with-param name= "wrt" select= "$TypeNamespace" />
</xsl:apply-templates>
<xsl:if test= "not($prototype)" >
<!-- hard space -->
<xsl:value-of select= "' '" />
<!-- parameter name -->
<xsl:value-of select= "$Param/@Name" />
</xsl:if>
</xsl:template>
<xsl:template name= "DisplayDocsInformation" >
<xsl:param name= "linkid" />
<!-- The namespace that the current type belongs to. -->
<xsl:variable name= "TypeNamespace" select= "substring(@FullName, 1, string-length(@FullName) - string-length(@Name) - 1)" />
<!-- alt member: not sure what these are for, actually -->
<xsl:if test= "count(Docs/altmember)" >
<xsl:call-template name= "CreateH4Section" >
<xsl:with-param name= "name" select= "'See Also'" />
<xsl:with-param name= "child-id" select= "concat ($linkid, ':See Also')" />
<xsl:with-param name= "content" >
<xsl:for-each select= "Docs/altmember" >
<div > <xsl:apply-templates select= "@cref" mode= "cref" /> </div>
</xsl:for-each>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<!-- parameters & return & value -->
<xsl:if test= "count(Docs/typeparam)" >
<xsl:call-template name= "CreateH4Section" >
<xsl:with-param name= "name" select= "'Type Parameters'" />
<xsl:with-param name= "child-id" select= "concat ($linkid, ':Type Parameters')" />
<xsl:with-param name= "content" >
<dl >
<xsl:for-each select= "Docs/typeparam" >
<dt > <i > <xsl:value-of select= "@name" /> </i> </dt>
<dd >
<xsl:apply-templates select= "." mode= "notoppara" />
<xsl:apply-templates select= "." mode= "editlink" />
</dd>
</xsl:for-each>
</dl>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<xsl:if test= "count(Docs/param)" >
<xsl:call-template name= "CreateH4Section" >
<xsl:with-param name= "name" select= "'Parameters'" />
<xsl:with-param name= "child-id" select= "concat ($linkid, ':Parameters')" />
<xsl:with-param name= "content" >
<dl >
<xsl:for-each select= "Docs/param" >
<dt > <i > <xsl:value-of select= "@name" /> </i> </dt>
<dd >
<xsl:apply-templates select= "." mode= "notoppara" />
<xsl:apply-templates select= "." mode= "editlink" />
</dd>
</xsl:for-each>
</dl>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<xsl:if test= "count(Docs/returns)" >
<xsl:call-template name= "CreateH4Section" >
<xsl:with-param name= "name" select= "'Returns'" />
<xsl:with-param name= "child-id" select= "concat ($linkid, ':Returns')" />
<xsl:with-param name= "content" >
<xsl:apply-templates select= "Docs/returns" mode= "notoppara" />
<xsl:apply-templates select= "Docs/returns" mode= "editlink" />
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<xsl:if test= "count(Docs/value)" >
<xsl:call-template name= "CreateH4Section" >
<xsl:with-param name= "name" select= "'Value'" />
<xsl:with-param name= "child-id" select= "concat ($linkid, ':Value')" />
<xsl:with-param name= "content" >
<xsl:apply-templates select= "Docs/value" mode= "notoppara" />
<xsl:apply-templates select= "Docs/value" mode= "editlink" />
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<!-- method/property/constructor exceptions -->
<xsl:if test= "count(Docs/exception)" >
<xsl:call-template name= "CreateH4Section" >
<xsl:with-param name= "name" select= "'Exceptions'" />
<xsl:with-param name= "child-id" select= "concat ($linkid, ':Exceptions')" />
<xsl:with-param name= "content" >
<xsl:call-template name= "CreateTypeDocumentationTable" >
<xsl:with-param name= "content" >
<xsl:for-each select= "Docs/exception" >
<tr valign= "top" >
<td >
<xsl:apply-templates select= "@cref" mode= "typelink" >
<xsl:with-param name= "wrt" select= "$TypeNamespace" />
</xsl:apply-templates>
</td>
<td >
<xsl:apply-templates select= "." mode= "notoppara" />
<xsl:apply-templates select= "." mode= "editlink" />
</td>
</tr>
</xsl:for-each>
</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<!-- remarks -->
<xsl:if test= "count(Docs/remarks)" >
<xsl:call-template name= "CreateH2Section" >
<xsl:with-param name= "name" select= "'Remarks'" />
<xsl:with-param name= "child-id" select= "concat ($linkid, ':Remarks')" />
<xsl:with-param name= "content" >
<xsl:apply-templates select= "Docs/remarks" mode= "notoppara" />
<xsl:apply-templates select= "Docs/remarks" mode= "editlink" />
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<!-- thread safety -->
<xsl:if test= "count(ThreadingSafetyStatement)" >
<xsl:call-template name= "CreateH2Section" >
<xsl:with-param name= "name" select= "'Thread Safety'" />
<xsl:with-param name= "child-id" select= "concat ($linkid, ':Thread Safety')" />
<xsl:with-param name= "content" >
<xsl:apply-templates select= "ThreadingSafetyStatement" mode= "notoppara" />
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<!-- permissions -->
<xsl:if test= "count(Docs/permission)" >
<xsl:call-template name= "CreateH2Section" >
<xsl:with-param name= "name" select= "'Permissions'" />
<xsl:with-param name= "child-id" select= "concat ($linkid, ':Permissions')" />
<xsl:with-param name= "content" >
<xsl:call-template name= "CreateTypeDocumentationTable" >
<xsl:with-param name= "content" >
<xsl:for-each select= "Docs/permission" >
<tr valign= "top" >
<td >
<xsl:apply-templates select= "@cref" mode= "typelink" >
<xsl:with-param name= "wrt" select= "$TypeNamespace" />
</xsl:apply-templates>
<xsl:apply-templates select= "." mode= "editlink" />
</td>
<td >
<xsl:apply-templates select= "." mode= "notoppara" />
</td>
</tr>
</xsl:for-each>
</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<!-- enumeration values -->
<xsl:if test= "Base/BaseTypeName = 'System.Enum'" >
<xsl:call-template name= "CreateH2Section" >
<xsl:with-param name= "name" select= "'Members'" />
<xsl:with-param name= "child-id" select= "concat ($linkid, ':Members')" />
<xsl:with-param name= "content" >
<xsl:call-template name= "CreateEnumerationTable" >
<xsl:with-param name= "content" >
<xsl:for-each select= "Members/Member[MemberType='Field']" >
<xsl:if test= "not(@MemberName='value__')" >
<tr valign= "top" > <td >
<xsl:attribute name= "id" >
<xsl:text > F:</xsl:text>
<xsl:value-of select= "translate (/Type/@FullName, '+', '.')" />
<xsl:text > .</xsl:text>
<xsl:value-of select= "@MemberName" />
</xsl:attribute>
<b >
<xsl:value-of select= "@MemberName" />
</b>
</td>
<td >
<xsl:apply-templates select= "Docs/summary" mode= "notoppara" />
<xsl:apply-templates select= "Docs/summary" mode= "editlink" />
</td>
</tr>
</xsl:if>
</xsl:for-each>
</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<!-- examples -->
<xsl:if test= "count(Docs/example)" >
<xsl:for-each select= "Docs/example" >
<xsl:call-template name= "CreateH2Section" >
<xsl:with-param name= "name" select= "'Example'" />
<xsl:with-param name= "child-id" select= "concat ($linkid, ':Example:', position())" />
<xsl:with-param name= "content" >
<xsl:apply-templates select= "." mode= "notoppara" />
</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
</xsl:if>
<!-- related content -->
<xsl:if test= "count(Docs/related)" >
<xsl:call-template name= "CreateH2Section" >
<xsl:with-param name= "name" select= "'Related content'" />
<xsl:with-param name= "child-id" select= "concat ($linkid, ':Related:')" />
<xsl:with-param name= "content" >
<div class= "related" >
2015-08-26 07:17:56 -04:00
<xsl:call-template name= "CreateRelatedSection" >
<xsl:with-param name= "section" select= "'Platform Docs'" />
<xsl:with-param name= "type" select= "'PlatformDocAPI'" />
</xsl:call-template>
2014-08-13 10:39:27 +01:00
<xsl:call-template name= "CreateRelatedSection" >
<xsl:with-param name= "section" select= "'Articles'" />
<xsl:with-param name= "type" select= "'article'" />
</xsl:call-template>
<xsl:call-template name= "CreateRelatedSection" >
<xsl:with-param name= "section" select= "'Recipes'" />
<xsl:with-param name= "type" select= "'recipe'" />
</xsl:call-template>
<xsl:call-template name= "CreateRelatedSection" >
<xsl:with-param name= "section" select= "'Samples'" />
<xsl:with-param name= "type" select= "'sample'" />
</xsl:call-template>
<xsl:call-template name= "CreateRelatedSection" >
<xsl:with-param name= "section" select= "'Related specifications'" />
<xsl:with-param name= "type" select= "'specification'" />
</xsl:call-template>
<xsl:call-template name= "CreateRelatedSection" >
<xsl:with-param name= "section" select= "'External Documentation'" />
<xsl:with-param name= "type" select= "'externalDocumentation'" />
</xsl:call-template>
</div>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<xsl:call-template name= "CreateH2Section" >
<xsl:with-param name= "name" select= "'Requirements'" />
<xsl:with-param name= "child-id" select= "concat ($linkid, ':Version Information')" />
<xsl:with-param name= "content" >
<xsl:call-template name= "CreatePlatformRequirements" />
<b > Namespace: </b> <xsl:value-of select= "substring(/Type/@FullName, 1, string-length(/Type/@FullName) - string-length(/Type/@Name) - 1)" />
<xsl:if test= "count(/Type/AssemblyInfo/AssemblyName) > 0" >
<br />
<b > Assembly: </b>
<xsl:value-of select= "/Type/AssemblyInfo/AssemblyName" />
<xsl:text > (in </xsl:text>
<xsl:value-of select= "/Type/AssemblyInfo/AssemblyName" />
<xsl:text > .dll)</xsl:text>
</xsl:if>
<xsl:if test= "count(AssemblyInfo/AssemblyVersion) > 0" >
<br />
<b > Assembly Versions: </b>
<xsl:for-each select= "AssemblyInfo/AssemblyVersion" >
<xsl:if test= "not(position()=1)" > , </xsl:if>
<xsl:value-of select= "." />
</xsl:for-each>
</xsl:if>
<xsl:if test= "count(Docs/since) > 0" >
<br />
<b > Since: </b>
<xsl:for-each select= "Docs/since" >
<xsl:if test= "not(position()=1)" > ; </xsl:if>
<xsl:value-of select= "@version" />
</xsl:for-each>
</xsl:if>
<xsl:if test= "count(Docs/since)=0 and count(/Type/Docs/since) > 0" >
<br />
<b > Since: </b>
<xsl:for-each select= "/Type/Docs/since" >
<xsl:if test= "not(position()=1)" > ; </xsl:if>
<xsl:value-of select= "@version" />
</xsl:for-each>
</xsl:if>
</xsl:with-param>
</xsl:call-template>
</xsl:template>
<!-- Transforms the contents of the selected node into a hyperlink to the type named by the node. The node can contain a type name (eg System.Object) or a type link (eg T:System.String). Use wrt parameter to specify the current namespace. -->
<xsl:template match= "*|@*" mode= "typelink" >
<xsl:param name= "wrt" select= "'notset'" />
<xsl:call-template name= "maketypelink" >
<xsl:with-param name= "type" select= "." />
<xsl:with-param name= "wrt" select= "$wrt" />
</xsl:call-template>
</xsl:template>
<xsl:template name= "makenamespacelink" >
<xsl:param name= "cref" select= "''" />
<a >
<xsl:attribute name= "href" >
<xsl:call-template name= "GetLinkTargetHtml" >
<xsl:with-param name= "cref" select= "$cref" />
</xsl:call-template>
</xsl:attribute>
<xsl:value-of select= "substring-after ($cref, 'N:')" />
</a>
</xsl:template>
<xsl:template name= "maketypelink" >
<xsl:param name= "type" select= "'notset'" />
<xsl:param name= "wrt" select= "'notset'" />
<xsl:param name= "nested" select= "0" />
<xsl:variable name= "btype" >
<xsl:call-template name= "ToBrackets" >
<xsl:with-param name= "s" select= "$type" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "array" >
<xsl:call-template name= "GetArraySuffix" >
<xsl:with-param name= "type" select= "$type" />
</xsl:call-template>
</xsl:variable>
<xsl:choose >
<!-- chop off T: -->
<xsl:when test= "starts-with($type, 'T:')" >
<xsl:call-template name= "maketypelink" >
<xsl:with-param name= "type" select= "substring($type, 3)" />
<xsl:with-param name= "wrt" select= "$wrt" />
</xsl:call-template>
</xsl:when>
<xsl:when test= "contains ( $ t y p e , ' & a m p ; ' ) a n d
'& ' = substring ($type, string-length ($type), 1)">
<xsl:call-template name= "maketypelink" >
<xsl:with-param name= "type" select= "substring($type, 1, string-length($type)-1)" />
<xsl:with-param name= "wrt" select= "$wrt" />
</xsl:call-template>
</xsl:when>
<xsl:when test= "string($array)" >
<xsl:call-template name= "maketypelink" >
<xsl:with-param name= "type" select= "substring($type, 1, string-length($type) - string-length ($array))" />
<xsl:with-param name= "wrt" select= "$wrt" />
</xsl:call-template>
<xsl:value-of select= "$array" />
</xsl:when>
<xsl:when test= "contains ( $ t y p e , ' * ' ) a n d
'*' = substring ($type, string-length ($type), 1)">
<xsl:call-template name= "maketypelink" >
<xsl:with-param name= "type" select= "substring($type, 1, string-length($type)-1)" />
<xsl:with-param name= "wrt" select= "$wrt" />
</xsl:call-template>
<xsl:value-of select= "'*'" />
</xsl:when>
<!-- if this is a generic type parameter, don't make a link but italicize it and give it a tooltip instead -->
<xsl:when test= "count($ThisType/TypeParameters/TypeParameter[@Name=$type] |
$ThisType/TypeParameters/TypeParameter[child::text()=$type] |
ancestor::Member/Docs/typeparam[@name=$type]) = 1">
<!-- note that we check if it is a generic type using /Type/TypeParameters because that will have type parameters declared in an outer class if this is a nested class, but then we get the tooltip text from the type parameters documented in this file -->
<i title= "{$ThisType/Docs/typeparam[@name=$type] | ancestor::Member/Docs/typeparam[@name=$type]}" > <xsl:value-of select= "$type" /> </i>
</xsl:when>
<!-- if this is a generic type parameter of a base type, replace it with the type that it was instantiated with -->
<xsl:when test= "count(ancestor::Members/BaseTypeArgument[@TypeParamName=$type]) = 1" >
<!-- note that an overridden type parameter may be referenced in a type parameter within $type, but we can't replace that nicely since we can't parse generic type names here -->
<xsl:call-template name= "maketypelink" >
<xsl:with-param name= "type" select= "ancestor::Members/BaseTypeArgument[@TypeParamName=$type]" />
<xsl:with-param name= "wrt" select= "$wrt" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise >
<xsl:variable name= "escaped-type" >
<xsl:call-template name= "GetEscapedTypeName" >
<xsl:with-param name= "typename" select= "$btype" />
</xsl:call-template>
</xsl:variable>
<a >
<xsl:attribute name= "href" >
<xsl:call-template name= "GetLinkTargetHtml" >
<xsl:with-param name= "type" select= "$escaped-type" />
<xsl:with-param name= "cref" select= "concat ('T:', $escaped-type)" />
</xsl:call-template>
</xsl:attribute>
<xsl:call-template name= "GetTypeDisplayName" >
<xsl:with-param name= "T" select= "$btype" />
<xsl:with-param name= "wrt" select= "$wrt" />
</xsl:call-template>
</a>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name= "GetArraySuffix" >
<xsl:param name= "type" />
<xsl:if test= "contains ( $ t y p e , ' ] ' ) a n d
']' = substring ($type, string-length ($type), 1)">
<xsl:variable name= "start" >
<xsl:call-template name= "GetArraySuffixStart" >
<xsl:with-param name= "type" select= "$type" />
<xsl:with-param name= "i" select= "string-length ($type) - 1" />
</xsl:call-template>
</xsl:variable>
<xsl:value-of select= "substring ($type, $start)" />
</xsl:if>
</xsl:template>
<xsl:template name= "GetArraySuffixStart" >
<xsl:param name= "type" />
<xsl:param name= "i" />
<xsl:choose >
<xsl:when test= "substring ($type, $i, 1) = '['" >
<xsl:value-of select= "$i" />
</xsl:when>
<xsl:otherwise >
<xsl:call-template name= "GetArraySuffixStart" >
<xsl:with-param name= "type" select= "$type" />
<xsl:with-param name= "i" select= "$i - 1" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name= "GetTypeDisplayName" >
<xsl:param name= "T" />
<xsl:param name= "wrt" />
<!-- use C# - style names -->
<xsl:choose >
<xsl:when test= "$T='System.Object'" > object</xsl:when>
<xsl:when test= "$T='System.Boolean'" > bool</xsl:when>
<xsl:when test= "$T='System.Byte'" > byte</xsl:when>
<xsl:when test= "$T='System.Char'" > char</xsl:when>
<xsl:when test= "$T='System.Decimal'" > decimal</xsl:when>
<xsl:when test= "$T='System.Double'" > double</xsl:when>
<xsl:when test= "$T='System.Int16'" > short</xsl:when>
<xsl:when test= "$T='System.Int32'" > int</xsl:when>
<xsl:when test= "$T='System.Int64'" > long</xsl:when>
<xsl:when test= "$T='System.SByte'" > sbyte</xsl:when>
<xsl:when test= "$T='System.Single'" > float</xsl:when>
<xsl:when test= "$T='System.String'" > string</xsl:when>
<xsl:when test= "$T='System.UInt16'" > ushort</xsl:when>
<xsl:when test= "$T='System.UInt32'" > uint</xsl:when>
<xsl:when test= "$T='System.UInt64'" > ulong</xsl:when>
<xsl:when test= "$T='System.Void'" > void</xsl:when>
<xsl:when test= "contains($T, '<')" >
<xsl:call-template name= "GetTypeDisplayName" >
<xsl:with-param name= "T" select= "substring-before ($T, '<')" />
<xsl:with-param name= "wrt" select= "$wrt" />
</xsl:call-template>
<xsl:text > < </xsl:text>
<xsl:call-template name= "GetMemberArgList" >
<xsl:with-param name= "arglist" select= "substring-after ($T, '<')" />
<xsl:with-param name= "wrt" select= "$wrt" />
</xsl:call-template>
<!-- don't need to append > as GetMemberArgList (eventually) appends it -->
</xsl:when>
<!-- if the type is in the wrt namespace, omit the namespace name -->
<xsl:when test= "not($wrt='') and starts-with($T, concat($wrt,'.')) and not(contains(substring-after($T,concat($wrt,'.')), '.'))" >
<xsl:value-of select= "translate (substring-after($T,concat($wrt,'.')), '+', '.')" />
</xsl:when>
<!-- if the type is in the System namespace, omit the namespace name -->
<xsl:when test= "starts-with($T, 'System.') and not(contains(substring-after($T, 'System.'), '.'))" >
<xsl:value-of select= "translate (substring-after($T,'System.'), '+', '.')" />
</xsl:when>
<!-- if the type is in the System.Collections namespace, omit the namespace name -->
<xsl:when test= "starts-with($T, 'System.Collections.') and not(contains(substring-after($T, 'System.Collections.'), '.'))" >
<xsl:value-of select= "translate (substring-after($T,'System.Collections.'), '+', '.')" />
</xsl:when>
<!-- if the type is in the System.Collections.Generic namespace, omit the namespace name -->
<xsl:when test= "starts-with($T, 'System.Collections.Generic.') and not(contains(substring-after($T, 'System.Collections.Generic.'), '.'))" >
<xsl:value-of select= "translate (substring-after($T,'System.Collections.Generic.'), '+', '.')" />
</xsl:when>
<xsl:otherwise >
<xsl:value-of select= "translate ($T, '+', '.')" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name= "GetMemberDisplayName" >
<xsl:param name= "memberName" />
<xsl:param name= "isproperty" select= "false()" />
<xsl:choose >
<xsl:when test= "contains($memberName, '.')" >
<xsl:call-template name= "GetTypeDisplayName" >
<xsl:with-param name= "T" >
<xsl:call-template name= "GetTypeName" >
<xsl:with-param name= "type" select= "$memberName" />
</xsl:call-template>
</xsl:with-param>
<xsl:with-param name= "wrt" select= "''" />
</xsl:call-template>
<xsl:text > .</xsl:text>
<xsl:call-template name= "GetMemberName" >
<xsl:with-param name= "type" select= "$memberName" />
<xsl:with-param name= "isproperty" select= "$isproperty" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise >
<xsl:value-of select= "$memberName" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name= "ToBrackets" >
<xsl:param name= "s" />
<xsl:value-of select= "translate (translate ($s, '{', '<'), '}', '>')" />
</xsl:template>
<xsl:template name= "ToBraces" >
<xsl:param name= "s" />
<xsl:value-of select= "translate (translate ($s, '<', '{'), '>', '}')" />
</xsl:template>
<xsl:template name= "memberlinkprefix" >
<xsl:param name= "member" />
<xsl:choose >
<xsl:when test= "$member/MemberType='Constructor'" > C</xsl:when>
<xsl:when test= "$member/MemberType='Method'" > M</xsl:when>
<xsl:when test= "$member/MemberType='Property'" > P</xsl:when>
<xsl:when test= "$member/MemberType='Field'" > F</xsl:when>
<xsl:when test= "$member/MemberType='Event'" > E</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name= "makememberlink" >
<xsl:param name= "cref" />
<xsl:variable name= "bcref" >
<xsl:call-template name= "ToBrackets" >
<xsl:with-param name= "s" select= "$cref" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "fullname" >
<xsl:choose >
<xsl:when test= "starts-with($bcref, 'C:') or starts-with($bcref, 'T:')" >
<xsl:choose >
<xsl:when test= "contains($bcref, '(')" >
<xsl:value-of select= "substring (substring-before ($bcref, '('), 3)" />
</xsl:when>
<xsl:otherwise >
<xsl:value-of select= "substring($bcref, 3)" />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise >
<xsl:call-template name= "GetTypeName" >
<xsl:with-param name= "type" select= "substring($bcref, 3)" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name= "memberName" >
<xsl:choose >
<xsl:when test= "starts-with($bcref, 'T:')" />
<xsl:when test= "starts-with($bcref, 'C:') and not(contains($bcref, '('))" />
<xsl:when test= "starts-with($bcref, 'C:') and contains($bcref, '(')" >
<xsl:text > (</xsl:text>
<xsl:call-template name= "GetMemberArgList" >
<xsl:with-param name= "arglist" select= "substring-before(substring-after($bcref, '('), ')')" />
<xsl:with-param name= "wrt" select= "$TypeNamespace" />
</xsl:call-template>
<xsl:text > )</xsl:text>
</xsl:when>
<xsl:otherwise >
<xsl:text > .</xsl:text>
<xsl:call-template name= "GetMemberName" >
<xsl:with-param name= "type" select= "substring($bcref, 3)" />
<xsl:with-param name= "wrt" select= "$fullname" />
<xsl:with-param name= "isproperty" select= "starts-with($bcref, 'P:')" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name= "escaped-type" >
<xsl:call-template name= "GetEscapedTypeName" >
<xsl:with-param name= "typename" >
<xsl:call-template name= "ToBrackets" >
<xsl:with-param name= "s" select= "$fullname" />
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "displayname" >
<xsl:call-template name= "GetTypeDisplayName" >
<xsl:with-param name= "T" select= "$fullname" />
<xsl:with-param name= "wrt" select= "$TypeNamespace" />
</xsl:call-template>
</xsl:variable>
<a >
<xsl:attribute name= "href" >
<xsl:call-template name= "GetLinkTargetHtml" >
<xsl:with-param name= "type" select= "$escaped-type" />
<xsl:with-param name= "cref" >
<xsl:call-template name= "ToBraces" >
<xsl:with-param name= "s" select= "$cref" />
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:attribute>
<xsl:value-of select= "translate (concat($displayname, $memberName), '+', '.')" />
</a>
</xsl:template>
<xsl:template name= "GetTypeName" >
<xsl:param name= "type" />
<xsl:variable name= "prefix" select= "substring-before($type, '.')" />
<xsl:variable name= "suffix" select= "substring-after($type, '.')" />
<xsl:choose >
<xsl:when test= "contains($type, '(')" >
<xsl:call-template name= "GetTypeName" >
<xsl:with-param name= "type" select= "substring-before($type, '(')" />
</xsl:call-template>
</xsl:when>
<xsl:when test= "not(contains($suffix, '.'))" >
<xsl:value-of select= "$prefix" />
</xsl:when>
<xsl:otherwise >
<xsl:value-of select= "$prefix" />
<xsl:text > .</xsl:text>
<xsl:call-template name= "GetTypeName" >
<xsl:with-param name= "type" select= "$suffix" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name= "GetMemberName" >
<xsl:param name= "type" />
<xsl:param name= "isproperty" select= "0" />
<xsl:variable name= "prefix" select= "substring-before($type, '.')" />
<xsl:variable name= "suffix" select= "substring-after($type, '.')" />
<xsl:choose >
<xsl:when test= "contains($type, '(')" >
<xsl:call-template name= "GetMemberName" >
<xsl:with-param name= "type" select= "substring-before($type, '(')" />
</xsl:call-template>
<xsl:text > (</xsl:text>
<xsl:call-template name= "GetMemberArgList" >
<xsl:with-param name= "arglist" select= "substring-before(substring-after($type, '('), ')')" />
<xsl:with-param name= "wrt" select= "$TypeNamespace" />
</xsl:call-template>
<xsl:text > )</xsl:text>
</xsl:when>
<xsl:when test= "not(contains($suffix, '.'))" >
<xsl:value-of select= "$suffix" />
</xsl:when>
<xsl:otherwise >
<xsl:call-template name= "GetMemberName" >
<xsl:with-param name= "type" select= "$suffix" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name= "GetMemberArgList" >
<xsl:param name= "arglist" />
<xsl:param name= "wrt" select= "''" />
<xsl:variable name= "_arglist" >
<xsl:choose >
<xsl:when test= "starts-with ($arglist, ',')" >
<xsl:value-of select= "substring-after ($arglist, ',')" />
</xsl:when>
<xsl:otherwise >
<xsl:value-of select= "$arglist" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test= "starts-with ($arglist, ',')" >
<xsl:text > , </xsl:text>
</xsl:if>
<xsl:variable name= "c" select= "substring-before ($_arglist, ',')" />
<xsl:variable name= "lt" select= "substring-before ($_arglist, '<')" />
<xsl:variable name= "gt" select= "substring-before ($_arglist, '>')" />
<xsl:choose >
<!-- Need to insert ',' between type arguments -->
<xsl:when test= "
($c != '' and $lt != '' and $gt != '' and
string-length ($c) < string-length ($lt) and
string-length ($c) < string-length ($gt)) or
($c != '' and $lt != '' and $gt = '' and
string-length ($c) < string-length ($lt)) or
($c != '' and $lt = '' and $gt != '' and
string-length ($c) < string-length ($gt)) or
($c != '' and $lt = '' and $gt = '')">
<xsl:call-template name= "GetTypeDisplayName" >
<xsl:with-param name= "T" select= "$c" />
<xsl:with-param name= "wrt" select= "$wrt" />
</xsl:call-template>
<xsl:text > , </xsl:text>
<xsl:call-template name= "GetMemberArgList" >
<xsl:with-param name= "arglist" select= "substring-after($_arglist, ',')" />
<xsl:with-param name= "wrt" select= "$wrt" />
</xsl:call-template>
</xsl:when>
<!-- start of nested type argument list < -->
<xsl:when test= "
($c != '' and $lt != '' and $gt != '' and
string-length ($lt) < string-length ($c) and
string-length ($lt) < string-length ($gt)) or
($c != '' and $lt != '' and $gt = '' and
string-length ($lt) < string-length ($c)) or
($c = '' and $lt != '' and $gt != '' and
string-length ($lt) < string-length ($gt))">
<xsl:call-template name= "GetTypeDisplayName" >
<xsl:with-param name= "T" select= "$lt" />
<xsl:with-param name= "wrt" select= "$wrt" />
</xsl:call-template>
<xsl:text > < </xsl:text>
<xsl:call-template name= "GetMemberArgList" >
<xsl:with-param name= "arglist" select= "substring-after($_arglist, '<')" />
<xsl:with-param name= "wrt" select= "$wrt" />
</xsl:call-template>
</xsl:when>
<!-- end of (nested?) type argument list > -->
<xsl:when test= "
($c != '' and $lt != '' and $gt != '' and
string-length ($gt) < string-length ($c) and
string-length ($gt) < string-length ($lt)) or
($c != '' and $lt = '' and $gt = '' and
string-length ($gt) < string-length ($c)) or
($c = '' and $lt != '' and $gt != '' and
string-length ($gt) < string-length ($lt)) or
($c = '' and $lt = '' and $gt != '')">
<xsl:call-template name= "GetTypeDisplayName" >
<xsl:with-param name= "T" select= "$gt" />
<xsl:with-param name= "wrt" select= "$wrt" />
</xsl:call-template>
<xsl:text > > </xsl:text>
<xsl:call-template name= "GetMemberArgList" >
<xsl:with-param name= "arglist" select= "substring-after($_arglist, '>')" />
<xsl:with-param name= "wrt" select= "$wrt" />
</xsl:call-template>
</xsl:when>
<!-- nothing left to do -->
<xsl:otherwise >
<xsl:call-template name= "GetTypeDisplayName" >
<xsl:with-param name= "T" select= "$_arglist" />
<xsl:with-param name= "wrt" select= "$wrt" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Transforms the contents of the selected node containing a cref into a hyperlink. -->
<xsl:template match= "*|@*" mode= "cref" >
<xsl:call-template name= "makememberlink" >
<xsl:with-param name= "cref" select= "." />
</xsl:call-template>
<!--
<a >
<xsl:attribute name= "href" > <xsl:value-of select= "." /> </xsl:attribute>
<xsl:value-of select= "substring-after(., ':')" /> </a>
-->
</xsl:template>
<xsl:template name= "membertypeplural" >
<xsl:param name= "name" />
<xsl:choose >
<xsl:when test= "$name='ExtensionMethod'" > Extension Methods</xsl:when>
<xsl:when test= "$name='Constructor'" > Constructors</xsl:when>
<xsl:when test= "$name='Property'" > Properties</xsl:when>
<xsl:when test= "$name='Method'" > Methods</xsl:when>
<xsl:when test= "$name='Field'" > Fields</xsl:when>
<xsl:when test= "$name='Event'" > Events</xsl:when>
<xsl:when test= "$name='Operator'" > Operators</xsl:when>
<xsl:when test= "$name='Explicit'" > Explicitly Implemented Interface Members</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name= "membertypeplurallc" >
<xsl:param name= "name" />
<xsl:choose >
<xsl:when test= "$name='ExtensionMethod'" > extension methods</xsl:when>
<xsl:when test= "$name='Constructor'" > constructors</xsl:when>
<xsl:when test= "$name='Property'" > properties</xsl:when>
<xsl:when test= "$name='Method'" > methods</xsl:when>
<xsl:when test= "$name='Field'" > fields</xsl:when>
<xsl:when test= "$name='Event'" > events</xsl:when>
<xsl:when test= "$name='Operator'" > operators</xsl:when>
<xsl:when test= "$name='Explicit'" > explicitly implemented interface members</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name= "gettypetype" >
<xsl:variable name= "sig" select= "concat(' ', TypeSignature[@Language='C#']/@Value, ' ')" />
<xsl:choose >
<xsl:when test= "contains($sig,'class')" > Class</xsl:when>
<xsl:when test= "contains($sig,'enum')" > Enumeration</xsl:when>
<xsl:when test= "contains($sig,'struct')" > Structure</xsl:when>
<xsl:when test= "contains($sig,'delegate')" > Delegate</xsl:when>
</xsl:choose>
</xsl:template>
<!-- Ensures that the resuting node is not surrounded by a para tag. -->
<xsl:template match= "*|@*" mode= "editlink" >
<xsl:call-template name= "CreateEditLink" >
<xsl:with-param name= "e" select= "." />
</xsl:call-template>
</xsl:template>
<xsl:template match= "*" mode= "notoppara" >
<xsl:choose >
<xsl:when test= "starts-with (string(.), 'To be added')" >
<span class= "NotEntered" > Documentation for this section has not yet been entered.</span>
</xsl:when>
<xsl:when test= "count(*) = 1 and count(para)=1" >
<xsl:apply-templates select= "para/node()" />
</xsl:when>
<xsl:otherwise >
<xsl:apply-templates select= "." />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match= "para" >
<p >
<xsl:apply-templates />
</p>
</xsl:template>
<xsl:template match= "attribution" >
<a href= "http://creativecommons.org/licenses/by/4.0/" class= "attributionlogo" >
<xsl:attribute name= "title" >
<xsl:choose >
<xsl:when test= "@modified='false'" > <xsl:value-of select= "concat('This content is licensed Creative Commons By ', @from)" /> </xsl:when>
<xsl:otherwise > <xsl:value-of select= "concat('This content has been modified under a Creative Commons license from ', @from)" /> </xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<img src= "mdocimages/creativecommons.png" />
</a>
</xsl:template>
<xsl:template match= "paramref" >
<i > <xsl:value-of select= "@name" />
<xsl:apply-templates />
</i>
</xsl:template>
<xsl:template match= "typeparamref" >
<i > <xsl:value-of select= "@name" />
<xsl:apply-templates />
</i>
</xsl:template>
<xsl:template match= "block[@type='note']" >
<div >
<i > Note: </i>
<xsl:apply-templates />
</div>
</xsl:template>
<xsl:template match= "block[@type='behaviors']" >
<h5 class= "Subsection" > Operation</h5>
<xsl:apply-templates />
</xsl:template>
<xsl:template match= "block[@type='overrides']" >
<h5 class= "Subsection" > Note to Inheritors</h5>
<xsl:apply-templates />
</xsl:template>
<xsl:template match= "block[@type='usage']" >
<h5 class= "Subsection" > Usage</h5>
<xsl:apply-templates />
</xsl:template>
<xsl:template match= "c" >
<tt >
<xsl:apply-templates />
</tt>
</xsl:template>
<xsl:template match= "c//para" >
<xsl:apply-templates /> <br />
</xsl:template>
<xsl:template match= "code" >
<xsl:call-template name= "CreateCodeBlock" >
<xsl:with-param name= "language" select= "@lang" />
<xsl:with-param name= "content" select= "string(descendant-or-self::text())" />
</xsl:call-template>
</xsl:template>
<xsl:template match= "img" >
<p >
<img >
<xsl:attribute name= "src" >
<!-- we recognize two types of images:
- those with src attribute that reference directly an external image
- those with a href attributes which are internally available as part of the doc bundle
-->
<xsl:choose >
<xsl:when test= "count(@src)>0" >
<xsl:value-of select= "@src" />
</xsl:when>
<xsl:when test= "count(@href)>0" >
<xsl:value-of select= "concat('source-id:', $source-id, ':', @href)" />
</xsl:when>
</xsl:choose>
</xsl:attribute>
<xsl:attribute name= "class" >
<xsl:choose >
<xsl:when test= "count(@class)>0" >
<xsl:value-of select= "@class" />
</xsl:when>
<xsl:otherwise > picture</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</img>
</p>
</xsl:template>
<xsl:template match= "onequarter" > ¼</xsl:template>
<xsl:template match= "pi" > π</xsl:template>
<xsl:template match= "theta" > θ</xsl:template>
<xsl:template match= "leq" > ≤</xsl:template>
<xsl:template match= "geq" > ≥</xsl:template>
<xsl:template match= "subscript" >
<sub > <xsl:value-of select= "@term" /> </sub>
</xsl:template>
<xsl:template match= "superscript" >
<sup > <xsl:value-of select= "@term" /> </sup>
</xsl:template>
<!-- tabular data
example:
<list type= "table" >
<listheader >
<term > First Col Header</term>
<description > Second Col Header</description>
<description > Third Col Header</description>
</listheader>
<item >
<term > First Row First Col</term>
<description > First Row Second Col</description>
<description > First Row Third Col</description>
</item>
<item >
<term > Second Row First Col</term>
<description > Second Row Second Col</description>
<description > Second Row Third Col</description>
</item>
</list>
-->
<xsl:template match= "list[@type='table']" >
<xsl:call-template name= "CreateListTable" >
<xsl:with-param name= "header" >
<th > <xsl:apply-templates select= "listheader/term" mode= "notoppara" /> </th>
<xsl:for-each select= "listheader/description" >
<th > <xsl:apply-templates mode= "notoppara" /> </th>
</xsl:for-each>
</xsl:with-param>
<xsl:with-param name= "content" >
<xsl:for-each select= "item" >
<tr valign= "top" >
<td >
<xsl:apply-templates select= "term" mode= "notoppara" />
</td>
<xsl:for-each select= "description" >
<td >
<xsl:apply-templates mode= "notoppara" />
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match= "list[@type='bullet']" >
<ul >
<xsl:for-each select= "item" >
<li >
<xsl:apply-templates select= "term" mode= "notoppara" />
<xsl:apply-templates select= "para" mode= "notoppara" />
</li>
</xsl:for-each>
</ul>
</xsl:template>
<xsl:template match= "list[@type='number']" >
<ol >
<xsl:for-each select= "item" >
<li >
<xsl:apply-templates select= "term" mode= "notoppara" />
</li>
</xsl:for-each>
</ol>
</xsl:template>
<xsl:template match= "list" >
[<i > The '<xsl:value-of select= "@type" /> ' type of list has not been implemented in the ECMA stylesheet.</i> ]
<xsl:message >
[<i > The '<xsl:value-of select= "@type" /> ' type of list has not been implemented in the ECMA stylesheet.</i> ]
</xsl:message>
</xsl:template>
<xsl:template match= "see[@cref]" >
<xsl:choose >
<xsl:when test= "not(substring-after(@cref, 'T:')='')" >
<xsl:call-template name= "maketypelink" >
<xsl:with-param name= "type" select= "normalize-space (@cref)" />
</xsl:call-template>
</xsl:when>
<xsl:when test= "not(substring-after(@cref, 'N:')='')" >
<xsl:call-template name= "makenamespacelink" >
<xsl:with-param name= "cref" select= "normalize-space (@cref)" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise >
<xsl:call-template name= "makememberlink" >
<xsl:with-param name= "cref" select= "normalize-space (@cref)" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match= "see[@langword]" >
<tt > <xsl:value-of select= "@langword" /> </tt>
</xsl:template>
<xsl:template name= "GetInheritedMembers" >
<xsl:param name= "declaringtype" />
<xsl:param name= "generictypereplacements" />
<xsl:param name= "listmembertype" />
<xsl:param name= "showprotected" />
<xsl:param name= "overloads-mode" select= "false()" />
<xsl:param name= "showstatic" select= '1' />
<xsl:choose >
<xsl:when test= "$listmembertype='ExtensionMethod' and $showprotected=false()" >
<xsl:for-each select= "$declaringtype/Members/Member[MemberType=$listmembertype]" >
<Members Name= "Link/@Type" FullName= "Link/@Type" >
<Member MemberName= "{@MemberName}" >
<xsl:attribute name= "ExplicitMemberName" >
<xsl:call-template name= "GetMemberNameWithoutGenericTypes" >
<xsl:with-param name= "m" select= "@MemberName" />
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name= "TypeParameters" >
<xsl:call-template name= "GetTypeParameterNames" >
<xsl:with-param name= "member" select= "." />
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name= "Parameters" >
<xsl:call-template name= "GetParameterTypes" >
<xsl:with-param name= "member" select= "." />
</xsl:call-template>
</xsl:attribute>
<xsl:copy-of select= "./*" />
</Member>
</Members>
</xsl:for-each>
</xsl:when>
<xsl:otherwise >
<Members Name= "{$declaringtype/@Name}" FullName= "{$declaringtype/@FullName}" >
<xsl:copy-of select= "$generictypereplacements" />
<!-- Get all members in this type that are of listmembertype and are either
protected or not protected according to showprotected. -->
<xsl:choose >
<xsl:when test= "$listmembertype = 'Explicit'" >
<xsl:for-each select= "$declaringtype/Members/Member
[MemberType != 'Constructor']
[contains (@MemberName, '.')]">
<Member MemberName= "{@MemberName}" >
<xsl:attribute name= "ExplicitMemberName" >
<xsl:call-template name= "GetMemberName" >
<xsl:with-param name= "type" select= "@MemberName" />
<xsl:with-param name= "isproperty" select= "$listmembertype = 'Property'" />
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name= "TypeParameters" >
<xsl:call-template name= "GetTypeParameterNames" >
<xsl:with-param name= "member" select= "." />
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name= "Parameters" >
<xsl:call-template name= "GetParameterTypes" >
<xsl:with-param name= "member" select= "." />
</xsl:call-template>
</xsl:attribute>
<xsl:copy-of select= "./*" />
</Member>
</xsl:for-each>
</xsl:when>
<xsl:otherwise >
<xsl:for-each select= "$declaringtype/Members/Member
[(MemberType=$listmembertype or ($listmembertype='Operator' and MemberType='Method'))]
[(not($overloads-mode) or @MemberName=$index or
($index='Conversion' and (@MemberName='op_Implicit' or @MemberName='op_Explicit'))) ]
[$showprotected=starts-with(MemberSignature[@Language='C#']/@Value, 'protected ')]
[($listmembertype='Method' and not(starts-with(@MemberName,'op_')))
or ($listmembertype='Operator' and starts-with(@MemberName,'op_'))
or (not($listmembertype='Method') and not($listmembertype='Operator'))]
[$showstatic or not(contains(MemberSignature[@Language='C#']/@Value,' static '))]
[$listmembertype = 'Constructor' or not(contains(@MemberName, '.'))]
">
<Member MemberName= "{@MemberName}" >
<xsl:attribute name= "ExplicitMemberName" >
<xsl:call-template name= "GetMemberNameWithoutGenericTypes" >
<xsl:with-param name= "m" select= "@MemberName" />
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name= "TypeParameters" >
<xsl:call-template name= "GetTypeParameterNames" >
<xsl:with-param name= "member" select= "." />
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name= "Parameters" >
<xsl:call-template name= "GetParameterTypes" >
<xsl:with-param name= "member" select= "." />
</xsl:call-template>
</xsl:attribute>
<xsl:copy-of select= "./*" />
</Member>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
<Docs >
<xsl:copy-of select= "$declaringtype/Docs/typeparam" />
</Docs>
</Members>
</xsl:otherwise>
</xsl:choose>
<xsl:if test= "not($listmembertype='Constructor') and count($declaringtype/Base/BaseTypeName)=1" >
<xsl:variable name= "basedocsfile" >
<xsl:call-template name= "GetLinkTarget" >
<xsl:with-param name= "type" >
<xsl:call-template name= "GetEscapedTypeName" >
<xsl:with-param name= "typename" select= "$declaringtype/Base/BaseTypeName" />
</xsl:call-template>
</xsl:with-param>
<xsl:with-param name= "cref" >
</xsl:with-param>
<xsl:with-param name= "local-suffix" />
<xsl:with-param name= "remote" />
<xsl:with-param name= "xmltarget" select= '1' />
</xsl:call-template>
</xsl:variable>
<xsl:if test= "not(string($basedocsfile) = '')" >
<xsl:call-template name= "GetInheritedMembers" >
<xsl:with-param name= "listmembertype" select= "$listmembertype" />
<xsl:with-param name= "showprotected" select= "$showprotected" />
<xsl:with-param name= "declaringtype" select= "document(string($basedocsfile),.)/Type" />
<xsl:with-param name= "generictypereplacements" select= "$declaringtype/Base/BaseTypeArguments/*" />
<xsl:with-param name= "showstatic" select= '0' />
</xsl:call-template>
</xsl:if>
</xsl:if>
</xsl:template>
<xsl:template name= "GetMemberNameWithoutGenericTypes" >
<xsl:param name= "m" />
<xsl:choose >
<xsl:when test= "contains ($m, '<')" >
<xsl:value-of select= "substring-before ($m, '<')" />
</xsl:when>
<xsl:otherwise >
<xsl:value-of select= "$m" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name= "GetTypeParameterNames" >
<xsl:param name= "member" />
<xsl:for-each select= "$member/TypeParameters/TypeParameter" >
<xsl:if test= "not(position()=1)" > , </xsl:if>
<xsl:value-of select= "@Name" />
</xsl:for-each>
</xsl:template>
<xsl:template name= "GetParameterTypes" >
<xsl:param name= "member" />
<xsl:for-each select= "$member/Parameters/Parameter" >
<xsl:if test= "not(position()=1)" > , </xsl:if>
<xsl:value-of select= "@Type" />
</xsl:for-each>
</xsl:template>
<xsl:template name= "ListAllMembers" >
<xsl:param name= "html-anchor" select= "false()" />
<xsl:call-template name= "ListMembers" >
<xsl:with-param name= "listmembertype" select= "'Constructor'" />
<xsl:with-param name= "showprotected" select= "false()" />
<xsl:with-param name= "html-anchor" select= "$html-anchor" />
</xsl:call-template>
<xsl:call-template name= "ListMembers" >
<xsl:with-param name= "listmembertype" select= "'Constructor'" />
<xsl:with-param name= "showprotected" select= "true()" />
<xsl:with-param name= "html-anchor" select= "$html-anchor" />
</xsl:call-template>
<xsl:call-template name= "ListMembers" >
<xsl:with-param name= "listmembertype" select= "'Field'" />
<xsl:with-param name= "showprotected" select= "false()" />
<xsl:with-param name= "html-anchor" select= "$html-anchor" />
</xsl:call-template>
<xsl:call-template name= "ListMembers" >
<xsl:with-param name= "listmembertype" select= "'Field'" />
<xsl:with-param name= "showprotected" select= "true()" />
<xsl:with-param name= "html-anchor" select= "$html-anchor" />
</xsl:call-template>
<xsl:call-template name= "ListMembers" >
<xsl:with-param name= "listmembertype" select= "'Property'" />
<xsl:with-param name= "showprotected" select= "false()" />
<xsl:with-param name= "html-anchor" select= "$html-anchor" />
</xsl:call-template>
<xsl:call-template name= "ListMembers" >
<xsl:with-param name= "listmembertype" select= "'Property'" />
<xsl:with-param name= "showprotected" select= "true()" />
<xsl:with-param name= "html-anchor" select= "$html-anchor" />
</xsl:call-template>
<xsl:call-template name= "ListMembers" >
<xsl:with-param name= "listmembertype" select= "'Method'" />
<xsl:with-param name= "showprotected" select= "false()" />
<xsl:with-param name= "html-anchor" select= "$html-anchor" />
</xsl:call-template>
<xsl:call-template name= "ListMembers" >
<xsl:with-param name= "listmembertype" select= "'Method'" />
<xsl:with-param name= "showprotected" select= "true()" />
<xsl:with-param name= "html-anchor" select= "$html-anchor" />
</xsl:call-template>
<xsl:call-template name= "ListMembers" >
<xsl:with-param name= "listmembertype" select= "'Event'" />
<xsl:with-param name= "showprotected" select= "false()" />
<xsl:with-param name= "html-anchor" select= "$html-anchor" />
</xsl:call-template>
<xsl:call-template name= "ListMembers" >
<xsl:with-param name= "listmembertype" select= "'Event'" />
<xsl:with-param name= "showprotected" select= "true()" />
<xsl:with-param name= "html-anchor" select= "$html-anchor" />
</xsl:call-template>
<xsl:call-template name= "ListMembers" >
<xsl:with-param name= "listmembertype" select= "'Operator'" />
<xsl:with-param name= "showprotected" select= "false()" />
<xsl:with-param name= "html-anchor" select= "$html-anchor" />
</xsl:call-template>
<xsl:call-template name= "ListMembers" >
<xsl:with-param name= "listmembertype" select= "'Explicit'" />
<xsl:with-param name= "showprotected" select= "true()" />
<xsl:with-param name= "html-anchor" select= "$html-anchor" />
</xsl:call-template>
<xsl:call-template name= "ListMembers" >
<xsl:with-param name= "listmembertype" select= "'ExtensionMethod'" />
<xsl:with-param name= "showprotected" select= "false()" />
<xsl:with-param name= "html-anchor" select= "$html-anchor" />
</xsl:call-template>
</xsl:template>
<!-- Lists the members in the current Type node.
Only lists members of type listmembertype.
Displays the signature in siglanguage.
showprotected = true() or false()
-->
<xsl:template name= "ListMembers" >
<xsl:param name= "listmembertype" />
<xsl:param name= "showprotected" />
<xsl:param name= "overloads-mode" select= "false()" />
<xsl:param name= "html-anchor" select= "false()" />
<!-- get name and namespace of current type -->
<xsl:variable name= "TypeFullName" select= "@FullName" />
<xsl:variable name= "TypeName" select= "@Name" />
<xsl:variable name= "TypeNamespace" select= "substring-before(@FullName, concat('.',@Name))" />
<xsl:variable name= "MEMBERS-rtf" >
<xsl:call-template name= "GetInheritedMembers" >
<xsl:with-param name= "listmembertype" select= "$listmembertype" />
<xsl:with-param name= "showprotected" select= "$showprotected" />
<xsl:with-param name= "declaringtype" select= "." />
<xsl:with-param name= "overloads-mode" select= "$overloads-mode" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "MEMBERS" select= "msxsl:node-set($MEMBERS-rtf)" />
<!--
<xsl:variable name= "MEMBERS" select= "
$ALLMEMBERS/Member
[(MemberType=$listmembertype or ($listmembertype='Operator' and MemberType='Method'))]
[$showprotected=contains(MemberSignature[@Language='C#']/@Value,'protected')]
[($listmembertype='Method' and not(starts-with(@MemberName,'op_')))
or ($listmembertype='Operator' and starts-with(@MemberName,'op_'))
or (not($listmembertype='Method') and not($listmembertype='Operator'))]
"/>
-->
<!-- if there aren't any, skip this -->
<xsl:if test= "count($MEMBERS//Member)" >
<xsl:variable name= "SectionName" >
<xsl:if test= "$listmembertype != 'Explicit' and $listmembertype != 'ExtensionMethod'" >
<xsl:if test= "$showprotected" > Protected </xsl:if>
<xsl:if test= "not($showprotected)" > Public </xsl:if>
</xsl:if>
<xsl:call-template name= "membertypeplural" > <xsl:with-param name= "name" select= "$listmembertype" /> </xsl:call-template>
</xsl:variable>
<!-- header -->
<xsl:call-template name= "CreateH2Section" >
<xsl:with-param name= "name" select= "$SectionName" />
<xsl:with-param name= "child-id" select= "$SectionName" />
<xsl:with-param name= "content" >
<div class= "SubsectionBox" >
<xsl:call-template name= "CreateMembersTable" >
<xsl:with-param name= "content" >
<xsl:for-each select= "$MEMBERS/Members/Member" >
<!-- <xsl:sort select="contains(MemberSignature[@Language='C#']/@Value,' static ')" data - type="text"/> -->
<xsl:sort select= "@MemberName = 'op_Implicit' or @MemberName = 'op_Explicit'" />
<xsl:sort select= "@ExplicitMemberName" data-type= "text" />
<xsl:sort select= "count(TypeParameters/TypeParameter)" />
<xsl:sort select= "@TypeParameters" />
<xsl:sort select= "count(Parameters/Parameter)" />
<xsl:sort select= "@Parameters" />
<xsl:variable name= "local-id" >
<xsl:choose >
<xsl:when test= "count(Link) = 1" >
<xsl:value-of select= "Link/@Member" />
</xsl:when>
<xsl:otherwise >
<xsl:call-template name= "GetLinkId" >
<xsl:with-param name= "type" select= "parent::Members" />
<xsl:with-param name= "member" select= "." />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name= "linkfile" >
<xsl:if test= "not(parent::Members/@FullName = $TypeFullName)" >
<xsl:call-template name= "GetLinkTargetHtml" >
<xsl:with-param name= "type" >
<xsl:choose >
<xsl:when test= "count(Link) = 1" >
<xsl:value-of select= "Link/@Type" />
</xsl:when>
<xsl:otherwise >
<xsl:call-template name= "GetEscapedTypeName" >
<xsl:with-param name= "typename" select= "parent::Members/@FullName" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
<xsl:with-param name= "cref" />
</xsl:call-template>
</xsl:if>
</xsl:variable>
<xsl:variable name= "linkid" >
<xsl:if test= "$html-anchor" >
<xsl:value-of select= "$linkfile" />
<xsl:text > #</xsl:text>
</xsl:if>
<xsl:value-of select= "$local-id" />
</xsl:variable>
<xsl:variable name= "isinherited" >
<xsl:if test= "$listmembertype != 'ExtensionMethod' and not(parent::Members/@FullName = $TypeFullName)" >
<xsl:text > (</xsl:text>
<i >
<xsl:text > Inherited from </xsl:text>
<xsl:call-template name= "maketypelink" >
<xsl:with-param name= "type" select= "parent::Members/@FullName" />
<xsl:with-param name= "wrt" select= "$TypeNamespace" />
</xsl:call-template>
<xsl:text > .</xsl:text>
</i>
<xsl:text > )</xsl:text>
</xsl:if>
</xsl:variable>
<tr valign= "top" >
<td >
<!-- random info -->
<!-- check if it has get and set accessors -->
<xsl:if test= "MemberType='Property' and not(contains(MemberSignature[@Language='C#']/@Value, 'set;'))" >
<xsl:text > [read-only]</xsl:text>
</xsl:if>
<xsl:if test= "MemberType='Property' and not(contains(MemberSignature[@Language='C#']/@Value, 'get;'))" >
<xsl:text > [write-only]</xsl:text>
</xsl:if>
<xsl:if test= "contains(MemberSignature[@Language='C#']/@Value,'this[')" >
<div > <i > default property</i> </div>
</xsl:if>
<div >
<xsl:call-template name= "getmodifiers" >
<xsl:with-param name= "sig" select= "MemberSignature[@Language='C#']/@Value" />
<xsl:with-param name= "protection" select= "false()" />
<xsl:with-param name= "inheritance" select= "true()" />
<xsl:with-param name= "extra" select= "false()" />
</xsl:call-template>
</div>
</td>
<xsl:choose >
<!-- constructor listing -->
<xsl:when test= "MemberType='Constructor'" >
<!-- link to constructor page -->
<td >
<div >
<b >
<a href= "{$linkid}" >
<xsl:call-template name= "GetConstructorName" >
<xsl:with-param name= "type" select= "parent::Members" />
<xsl:with-param name= "ctor" select= "." />
</xsl:call-template>
</a>
</b>
<!-- argument list -->
<xsl:value-of select= "'('" />
<xsl:for-each select= "Parameters/Parameter" >
<xsl:if test= "not(position()=1)" > , </xsl:if>
<xsl:call-template name= "ShowParameter" >
<xsl:with-param name= "Param" select= "." />
<xsl:with-param name= "TypeNamespace" select= "$TypeNamespace" />
<xsl:with-param name= "prototype" select= "true()" />
</xsl:call-template>
</xsl:for-each>
<xsl:value-of select= "')'" />
</div>
<!-- TODO: $implemented? -->
</td>
</xsl:when>
<xsl:when test= "$listmembertype = 'Explicit'" >
<td >
<a href= "{$linkid}" >
<b >
<xsl:call-template name= "GetMemberDisplayName" >
<xsl:with-param name= "memberName" select= "@MemberName" />
<xsl:with-param name= "isproperty" select= "MemberType='Property'" />
</xsl:call-template>
</b>
</a>
</td>
</xsl:when>
<!-- field, property and event listing -->
<xsl:when test= "MemberType='Field' or MemberType='Property' or MemberType='Event'" >
<td >
<!-- link to member page -->
<b >
<a href= "{$linkid}" >
<xsl:call-template name= "GetMemberDisplayName" >
<xsl:with-param name= "memberName" select= "@MemberName" />
<xsl:with-param name= "isproperty" select= "MemberType='Property'" />
</xsl:call-template>
</a>
</b>
<!-- argument list for accessors -->
<xsl:if test= "Parameters/Parameter" >
<xsl:value-of select= "'('" />
<xsl:for-each select= "Parameters/Parameter" >
<xsl:if test= "not(position()=1)" > , </xsl:if>
<xsl:call-template name= "ShowParameter" >
<xsl:with-param name= "Param" select= "." />
<xsl:with-param name= "TypeNamespace" select= "$TypeNamespace" />
<xsl:with-param name= "prototype" select= "true()" />
</xsl:call-template>
</xsl:for-each>
<xsl:value-of select= "')'" />
</xsl:if>
</td>
</xsl:when>
<!-- method listing -->
<xsl:when test= "$listmembertype='Method' or $listmembertype = 'ExtensionMethod'" >
<td colspan= "2" >
<!-- link to method page -->
<b >
<a href= "{$linkid}" >
<xsl:call-template name= "GetMemberDisplayName" >
<xsl:with-param name= "memberName" select= "@MemberName" />
<xsl:with-param name= "isproperty" select= "MemberType='Property'" />
</xsl:call-template>
</a>
</b>
<!-- argument list -->
<xsl:value-of select= "'('" />
<xsl:for-each select= "Parameters/Parameter" >
<xsl:if test= "not(position()=1)" > , </xsl:if>
<xsl:call-template name= "ShowParameter" >
<xsl:with-param name= "Param" select= "." />
<xsl:with-param name= "TypeNamespace" select= "$TypeNamespace" />
<xsl:with-param name= "prototype" select= "true()" />
</xsl:call-template>
</xsl:for-each>
<xsl:value-of select= "')'" />
<!-- return type -->
<xsl:if test= "not(ReturnValue/ReturnType='System.Void')" >
<nobr >
<xsl:text > : </xsl:text>
<xsl:apply-templates select= "ReturnValue/ReturnType" mode= "typelink" > <xsl:with-param name= "wrt" select= "$TypeNamespace" /> </xsl:apply-templates>
</nobr>
</xsl:if>
<blockquote >
<xsl:apply-templates select= "Docs/summary" mode= "notoppara" />
<xsl:copy-of select= "$isinherited" />
</blockquote>
</td>
</xsl:when>
<xsl:when test= "$listmembertype='Operator'" >
<td >
<!-- link to operator page -->
<xsl:choose >
<xsl:when test= "@MemberName='op_Implicit' or @MemberName='op_Explicit'" >
<b >
<a href= "{$linkid}" >
<xsl:text > Conversion</xsl:text>
<xsl:choose >
<xsl:when test= "ReturnValue/ReturnType = //Type/@FullName" >
<xsl:text > From </xsl:text>
<xsl:value-of select= "Parameters/Parameter/@Type" />
</xsl:when>
<xsl:otherwise >
<xsl:text > to </xsl:text>
<xsl:value-of select= "ReturnValue/ReturnType" />
</xsl:otherwise>
</xsl:choose>
</a>
</b>
<xsl:choose >
<xsl:when test= "@MemberName='op_Implicit'" >
<xsl:text > (Implicit)</xsl:text>
</xsl:when>
<xsl:otherwise >
<xsl:text > (Explicit)</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test= "count(Parameters/Parameter)=1" >
<b >
<a href= "{$linkid}" >
<xsl:value-of select= "substring-after(@MemberName, 'op_')" />
</a>
</b>
</xsl:when>
<xsl:otherwise >
<b >
<a href= "{$linkid}" >
<xsl:value-of select= "substring-after(@MemberName, 'op_')" />
</a>
</b>
<xsl:value-of select= "'('" />
<xsl:for-each select= "Parameters/Parameter" >
<xsl:if test= "not(position()=1)" > , </xsl:if>
<xsl:call-template name= "ShowParameter" >
<xsl:with-param name= "Param" select= "." />
<xsl:with-param name= "TypeNamespace" select= "$TypeNamespace" />
<xsl:with-param name= "prototype" select= "true()" />
</xsl:call-template>
</xsl:for-each>
<xsl:value-of select= "')'" />
</xsl:otherwise>
</xsl:choose>
</td>
</xsl:when>
<xsl:otherwise >
<!-- Other types: just provide a link -->
<td >
<a href= "{$linkid}" >
<xsl:call-template name= "GetMemberDisplayName" >
<xsl:with-param name= "memberName" select= "@MemberName" />
<xsl:with-param name= "isproperty" select= "MemberType='Property'" />
</xsl:call-template>
</a>
</td>
</xsl:otherwise>
</xsl:choose>
<xsl:if test= "$listmembertype != 'Method' and $listmembertype != 'ExtensionMethod'" >
<td >
<!-- description -->
<xsl:if test= "MemberType='Field' or MemberType = 'Property'" >
<i > <xsl:apply-templates select= "ReturnValue/ReturnType" mode= "typelink" > <xsl:with-param name= "wrt" select= "$TypeNamespace" /> </xsl:apply-templates> </i>
<xsl:if test= "MemberValue" > (<xsl:value-of select= "MemberValue" /> )</xsl:if>
<xsl:text > . </xsl:text>
</xsl:if>
<xsl:apply-templates select= "Docs/summary" mode= "notoppara" />
<xsl:copy-of select= "$isinherited" />
</td>
</xsl:if>
</tr>
</xsl:for-each>
</xsl:with-param>
</xsl:call-template>
</div>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name= "GetLinkName" >
<xsl:param name= "type" />
<xsl:param name= "member" />
<xsl:call-template name= "memberlinkprefix" >
<xsl:with-param name= "member" select= "$member" />
</xsl:call-template>
<xsl:text > :</xsl:text>
<xsl:call-template name= "GetEscapedTypeName" >
<xsl:with-param name= "typename" select= "$type/@FullName" />
</xsl:call-template>
<xsl:if test= "$member/MemberType != 'Constructor'" >
<xsl:text > .</xsl:text>
<xsl:variable name= "memberName" >
<xsl:call-template name= "GetGenericName" >
<xsl:with-param name= "membername" select= "$member/@MemberName" />
<xsl:with-param name= "member" select= "$member" />
</xsl:call-template>
</xsl:variable>
<xsl:call-template name= "Replace" >
<xsl:with-param name= "s" >
<xsl:call-template name= "ToBraces" >
<xsl:with-param name= "s" select= "$memberName" />
</xsl:call-template>
</xsl:with-param>
<xsl:with-param name= "from" > .</xsl:with-param>
<xsl:with-param name= "to" > #</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name= "GetGenericName" >
<xsl:param name= "membername" />
<xsl:param name= "member" />
<xsl:variable name= "numgenargs" select= "count($member/Docs/typeparam)" />
<xsl:choose >
<xsl:when test= "$numgenargs = 0" >
<xsl:value-of select= "$membername" />
</xsl:when>
<xsl:otherwise >
<xsl:if test= "contains($membername, '<')" >
<xsl:value-of select= "substring-before ($membername, '<')" />
</xsl:if>
<xsl:text > ``</xsl:text>
<xsl:value-of select= "$numgenargs" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name= "GetEscapedTypeName" >
<xsl:param name= "typename" />
<xsl:variable name= "base" select= "substring-before ($typename, '<')" />
<xsl:choose >
<xsl:when test= "$base != ''" >
<xsl:value-of select= "translate ($base, '+', '.')" />
<xsl:text > `</xsl:text>
<xsl:call-template name= "GetGenericArgumentCount" >
<xsl:with-param name= "arglist" select= "substring-after ($typename, '<')" />
<xsl:with-param name= "count" > 1</xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise > <xsl:value-of select= "translate ($typename, '+', '.')" /> </xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name= "GetGenericArgumentCount" >
<xsl:param name= "arglist" />
<xsl:param name= "count" />
<xsl:variable name= "rest-rtf" >
<xsl:call-template name= "SkipTypeArgument" >
<xsl:with-param name= "s" select= "$arglist" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "rest" select= "string($rest-rtf)" />
<xsl:choose >
<xsl:when test= "$arglist != '' and $rest = ''" >
<xsl:value-of select= "$count" />
</xsl:when>
<xsl:when test= "$arglist = '' and $rest = ''" >
<xsl:message terminate= "yes" >
!WTF? arglist=<xsl:value-of select= "$arglist" /> ; rest=<xsl:value-of select= "$rest" />
</xsl:message>
</xsl:when>
<xsl:when test= "starts-with ($rest, '>')" >
<xsl:value-of select= "$count" />
<xsl:call-template name= "GetEscapedTypeName" >
<xsl:with-param name= "typename" select= "substring-after ($rest, '>')" />
</xsl:call-template>
</xsl:when>
<xsl:when test= "starts-with ($rest, ',')" >
<xsl:call-template name= "GetGenericArgumentCount" >
<xsl:with-param name= "arglist" select= "substring-after ($rest, ',')" />
<xsl:with-param name= "count" select= "$count+1" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise >
<xsl:message terminate= "yes" >
!WTF 2? arglist=<xsl:value-of select= "$arglist" /> ; rest=<xsl:value-of select= "$rest" />
</xsl:message>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name= "SkipTypeArgument" >
<xsl:param name= "s" />
<xsl:variable name= "p-rtf" >
<xsl:call-template name= "GetCLtGtPositions" >
<xsl:with-param name= "s" select= "$s" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "p" select= "msxsl:node-set($p-rtf)" />
<xsl:choose >
<!--
Have to select between three `s' patterns:
A,B>: need to return ",B>"
Foo<A , B > >: Need to forward to SkipGenericArgument to eventually return ">"
Foo<A , B > +C>: Need to forward to SkipGenericArgument to eventually return ">"
-->
<xsl:when test= "starts-with ($s, '>')" >
<xsl:message terminate= "yes" >
SkipTypeArgument: invalid type substring '<xsl:value-of select= "$s" /> '
</xsl:message>
</xsl:when>
<xsl:when test= "$p/Comma/@Length > 0 and
($p/Lt/@Length = 0 or $p/Comma/@Length < $p/Lt/@Length) and
($p/Gt/@Length > 0 and $p/Comma/@Length < $p/Gt/@Length)">
<xsl:text > ,</xsl:text>
<xsl:value-of select= "substring-after ($s, ',')" />
</xsl:when>
<xsl:when test= "$p/Lt/@Length > 0 and $p/Lt/@Length < $p/Gt/@Length" >
<xsl:variable name= "r" >
<xsl:call-template name= "SkipGenericArgument" >
<xsl:with-param name= "s" select= "substring-after ($s, '<')" />
</xsl:call-template>
</xsl:variable>
<xsl:choose >
<xsl:when test= "starts-with ($r, '>') or starts-with ($r, '+')" >
<xsl:value-of select= "substring-after ($r, '>')" />
</xsl:when>
<xsl:when test= "starts-with ($r, ',')" >
<xsl:value-of select= "$r" />
</xsl:when>
<xsl:otherwise >
<xsl:message >
! WTF3: s=<xsl:value-of select= "$s" /> ; r=<xsl:value-of select= "$r" />
</xsl:message>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test= "$p/Gt/@Length > 0" >
<xsl:text > > </xsl:text>
<xsl:value-of select= "substring-after ($s, '>')" />
</xsl:when>
<xsl:otherwise > <xsl:value-of select= "$s" /> </xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name= "GetCLtGtPositions" >
<xsl:param name= "s" />
<xsl:variable name= "c" select= "substring-before ($s, ',')" />
<xsl:variable name= "lt" select= "substring-before ($s, '<')" />
<xsl:variable name= "gt" select= "substring-before ($s, '>')" />
<Comma String= "{$c}" Length= "{string-length ($c)}" />
<Lt String= "{$lt}" Length= "{string-length ($lt)}" />
<Gt String= "{$gt}" Length= "{string-length ($gt)}" />
</xsl:template>
<!--
when given 'Foo<A , B a r < B a z < C , D , E > >>>', returns '>'
when given 'Bar<C > +Nested>', returns '>'
when given 'Foo<A , B a r < B a z < C , D , E > >>,', returns ','
(basically, it matches '< ' to '>' and "skips" the intermediate type-name contents.
-->
<xsl:template name= "SkipGenericArgument" >
<xsl:param name= "s" />
<xsl:variable name= "p-rtf" >
<xsl:call-template name= "GetCLtGtPositions" >
<xsl:with-param name= "s" select= "$s" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "p" select= "msxsl:node-set($p-rtf)" />
<xsl:choose >
<xsl:when test= "starts-with ($s, '>')" >
<xsl:message terminate= "yes" >
SkipGenericArgument: invalid type substring '<xsl:value-of select= "$s" /> '
</xsl:message>
</xsl:when>
<xsl:when test= "$p/Lt/@Length > 0 and $p/Lt/@Length < $p/Gt/@Length" >
<!-- within 'Foo<A...'; look for matching '>' -->
<xsl:variable name= "r" >
<xsl:call-template name= "SkipGenericArgument" >
<xsl:with-param name= "s" select= "substring-after ($s, '<')" />
</xsl:call-template>
</xsl:variable>
<xsl:value-of select= "substring-after ($r, '>')" />
</xsl:when>
<xsl:when test= "$p/Gt/@Length > 0" >
<!-- <xsl:value - of select="substring ($s, string - length ($gt)+1)" /> -->
<xsl:value-of select= "substring-after ($s, '>')" />
</xsl:when>
<xsl:otherwise >
<xsl:value-of select= "$s" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name= "GetEscapedParameter" >
<xsl:param name= "orig-parameter-type" />
<xsl:param name= "parameter-type" />
<xsl:param name= "parameter-types" />
<xsl:param name= "escape" />
<xsl:param name= "index" />
<xsl:choose >
<xsl:when test= "$index > count($parameter-types)" >
<xsl:if test= "$parameter-type != $orig-parameter-type" >
<xsl:value-of select= "$parameter-type" />
</xsl:if>
<!-- ignore -->
</xsl:when>
<xsl:when test= "$parameter-types[position() = $index]/@name = $parameter-type" >
<xsl:value-of select= "concat ($escape, $index - 1)" />
</xsl:when>
<xsl:otherwise >
<xsl:variable name= "typeparam" select= "$parameter-types[position() = $index]/@name" />
<xsl:call-template name= "GetEscapedParameter" >
<xsl:with-param name= "orig-parameter-type" select= "$orig-parameter-type" />
<xsl:with-param name= "parameter-type" >
<xsl:call-template name= "Replace" >
<xsl:with-param name= "s" >
<xsl:call-template name= "Replace" >
<xsl:with-param name= "s" >
<xsl:call-template name= "Replace" >
<xsl:with-param name= "s" >
<xsl:call-template name= "Replace" >
<xsl:with-param name= "s" select= "$parameter-type" />
<xsl:with-param name= "from" select= "concat('<', $typeparam, '>')" />
<xsl:with-param name= "to" select= "concat('<', $escape, $index - 1, '>')" />
</xsl:call-template>
</xsl:with-param>
<xsl:with-param name= "from" select= "concat('<', $typeparam, ',')" />
<xsl:with-param name= "to" select= "concat('<', $escape, $index - 1, ',')" />
</xsl:call-template>
</xsl:with-param>
<xsl:with-param name= "from" select= "concat (',', $typeparam, '>')" />
<xsl:with-param name= "to" select= "concat(',', $escape, $index - 1, '>')" />
</xsl:call-template>
</xsl:with-param>
<xsl:with-param name= "from" select= "concat (',', $typeparam, ',')" />
<xsl:with-param name= "to" select= "concat(',', $escape, $index - 1, ',')" />
</xsl:call-template>
</xsl:with-param>
<xsl:with-param name= "parameter-types" select= "$parameter-types" />
<xsl:with-param name= "typeparam" select= "$typeparam" />
<xsl:with-param name= "escape" select= "$escape" />
<xsl:with-param name= "index" select= "$index + 1" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name= "GetLinkId" >
<xsl:param name= "type" />
<xsl:param name= "member" />
<xsl:call-template name= "GetLinkName" >
<xsl:with-param name= "type" select= "$type" />
<xsl:with-param name= "member" select= "$member" />
</xsl:call-template>
<xsl:if test= "count($member/Parameters/Parameter) > 0 or $member/MemberType='Method' or $member/MemberType='Constructor'" >
<xsl:text > (</xsl:text>
<xsl:for-each select= "Parameters/Parameter" >
<xsl:if test= "not(position()=1)" > ,</xsl:if>
<xsl:call-template name= "GetParameterType" >
<xsl:with-param name= "type" select= "$type" />
<xsl:with-param name= "member" select= "$member" />
<xsl:with-param name= "parameter" select= "." />
</xsl:call-template>
</xsl:for-each>
<xsl:text > )</xsl:text>
</xsl:if>
<xsl:if test= "$member/@MemberName='op_Implicit' or $member/@MemberName='op_Explicit'" >
<xsl:text > ~</xsl:text>
<xsl:variable name= "parameter-rtf" >
<Parameter Type= "{$member/ReturnValue/ReturnType}" />
</xsl:variable>
<xsl:call-template name= "GetParameterType" >
<xsl:with-param name= "type" select= "$type" />
<xsl:with-param name= "member" select= "$member" />
<xsl:with-param name= "parameter" select= "msxsl:node-set($parameter-rtf)/Parameter" />
</xsl:call-template>
</xsl:if>
</xsl:template>
<!--
- what should be <xsl:value-of select= "@Type" /> becomes a nightmare once
- generics enter the picture, since a parameter type could come from the
- type itelf (becoming `N) or from the method (becoming ``N).
-->
<xsl:template name= "GetParameterType" >
<xsl:param name= "type" />
<xsl:param name= "member" />
<xsl:param name= "parameter" />
<!-- the actual parameter type -->
<xsl:variable name= "ptype" >
<xsl:choose >
<xsl:when test= "contains($parameter/@Type, '[')" >
<xsl:value-of select= "substring-before ($parameter/@Type, '[')" />
</xsl:when>
<xsl:when test= "contains($parameter/@Type, '&')" >
<xsl:value-of select= "substring-before ($parameter/@Type, '&')" />
</xsl:when>
<xsl:when test= "contains($parameter/@Type, '*')" >
<xsl:value-of select= "substring-before ($parameter/@Type, '*')" />
</xsl:when>
<xsl:otherwise >
<xsl:value-of select= "$parameter/@Type" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- parameter modifiers -->
<xsl:variable name= "pmodifier" >
<xsl:call-template name= "Replace" >
<xsl:with-param name= "s" select= "substring-after ($parameter/@Type, $ptype)" />
<xsl:with-param name= "from" > & </xsl:with-param>
<xsl:with-param name= "to" > @</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "gen-type" >
<xsl:call-template name= "GetEscapedParameter" >
<xsl:with-param name= "orig-parameter-type" select= "$ptype" />
<xsl:with-param name= "parameter-type" >
<xsl:variable name= "nested" >
<xsl:call-template name= "GetEscapedParameter" >
<xsl:with-param name= "orig-parameter-type" select= "$ptype" />
<xsl:with-param name= "parameter-type" select= "$ptype" />
<xsl:with-param name= "parameter-types" select= "$type/Docs/typeparam" />
<xsl:with-param name= "escape" select= "'`'" />
<xsl:with-param name= "index" select= "1" />
</xsl:call-template>
</xsl:variable>
<xsl:choose >
<xsl:when test= "$nested != ''" >
<xsl:value-of select= "$nested" />
</xsl:when>
<xsl:otherwise >
<xsl:value-of select= "$ptype" />
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
<xsl:with-param name= "parameter-types" select= "$member/Docs/typeparam" />
<xsl:with-param name= "escape" select= "'``'" />
<xsl:with-param name= "index" select= "1" />
</xsl:call-template>
</xsl:variable>
<!-- the actual parameter type -->
<xsl:variable name= "parameter-type" >
<xsl:choose >
<xsl:when test= "$gen-type != ''" >
<xsl:value-of select= "$gen-type" />
<xsl:value-of select= "$pmodifier" />
</xsl:when>
<xsl:otherwise >
<xsl:value-of select= "concat($ptype, $pmodifier)" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- s/</{/g; s/>/}/g; so that less escaping is needed. -->
<xsl:call-template name= "Replace" >
<xsl:with-param name= "s" >
<xsl:call-template name= "Replace" >
<xsl:with-param name= "s" select= "translate ($parameter-type, '+', '.')" />
<xsl:with-param name= "from" > > </xsl:with-param>
<xsl:with-param name= "to" > }</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
<xsl:with-param name= "from" > < </xsl:with-param>
<xsl:with-param name= "to" > {</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name= "Replace" >
<xsl:param name= "s" />
<xsl:param name= "from" />
<xsl:param name= "to" />
<xsl:choose >
<xsl:when test= "not(contains($s, $from))" >
<xsl:value-of select= "$s" />
</xsl:when>
<xsl:otherwise >
<xsl:variable name= "prefix" select= "substring-before($s, $from)" />
<xsl:variable name= "suffix" select= "substring-after($s, $from)" />
<xsl:value-of select= "$prefix" />
<xsl:value-of select= "$to" />
<xsl:call-template name= "Replace" >
<xsl:with-param name= "s" select= "$suffix" />
<xsl:with-param name= "from" select= "$from" />
<xsl:with-param name= "to" select= "$to" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name= "getmodifiers" >
<xsl:param name= "sig" />
<xsl:param name= "protection" select= "true()" />
<xsl:param name= "inheritance" select= "true()" />
<xsl:param name= "extra" select= "true()" />
<xsl:param name= "typetype" select= "false()" />
<xsl:variable name= "Sig" >
<xsl:text > </xsl:text>
<xsl:choose >
<xsl:when test= "contains($sig, '{')" >
<xsl:value-of select= "substring-before ($sig, '{')" />
</xsl:when>
<xsl:otherwise >
<xsl:value-of select= "$sig" />
</xsl:otherwise>
</xsl:choose>
<xsl:text > </xsl:text>
</xsl:variable>
<xsl:if test= "$protection" >
<xsl:if test= "contains($Sig, ' public ')" > public </xsl:if>
<xsl:if test= "contains($Sig, ' private ')" > private </xsl:if>
<xsl:if test= "contains($Sig, ' protected ')" > protected </xsl:if>
<xsl:if test= "contains($Sig, ' internal ')" > internal </xsl:if>
</xsl:if>
<xsl:if test= "contains($Sig, ' static ')" > static </xsl:if>
<xsl:if test= "contains($Sig, ' abstract ')" > abstract </xsl:if>
<xsl:if test= "contains($Sig, ' operator ')" > operator </xsl:if>
<xsl:if test= "contains($Sig, ' const ')" > const </xsl:if>
<xsl:if test= "contains($Sig, ' readonly ')" > readonly </xsl:if>
<xsl:if test= "$inheritance" >
<xsl:if test= "contains($Sig, ' override ')" > override </xsl:if>
<xsl:if test= "contains($Sig, ' new ')" > new </xsl:if>
</xsl:if>
<xsl:if test= "$extra" >
<xsl:if test= "contains($Sig, ' sealed ')" > sealed </xsl:if>
<xsl:if test= "contains($Sig, ' virtual ')" > virtual </xsl:if>
<xsl:if test= "contains($Sig, ' extern ')" > extern </xsl:if>
<xsl:if test= "contains($Sig, ' checked ')" > checked </xsl:if>
<xsl:if test= "contains($Sig, ' unsafe ')" > unsafe </xsl:if>
<xsl:if test= "contains($Sig, ' volatile ')" > volatile </xsl:if>
<xsl:if test= "contains($Sig, ' explicit ')" > explicit </xsl:if>
<xsl:if test= "contains($Sig, ' implicit ')" > implicit </xsl:if>
</xsl:if>
<xsl:if test= "$typetype" >
<xsl:if test= "contains($Sig, ' class ')" > class </xsl:if>
<xsl:if test= "contains($Sig, ' interface ')" > interface </xsl:if>
<xsl:if test= "contains($Sig, ' struct ')" > struct </xsl:if>
<xsl:if test= "contains($Sig, ' delegate ')" > delegate </xsl:if>
<xsl:if test= "contains($Sig, ' enum ')" > enum </xsl:if>
</xsl:if>
</xsl:template>
<xsl:template name= "GetTypeDescription" >
<xsl:variable name= "sig" select= "TypeSignature[@Language='C#']/@Value" />
<xsl:choose >
<xsl:when test= "contains($sig, ' class ')" > Class</xsl:when>
<xsl:when test= "contains($sig, ' interface ')" > Interface</xsl:when>
<xsl:when test= "contains($sig, ' struct ')" > Struct</xsl:when>
<xsl:when test= "contains($sig, ' delegate ')" > Delegate</xsl:when>
<xsl:when test= "contains($sig, ' enum ')" > Enum</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match= "since" >
<p >
<i > Note: This namespace, class, or member is supported only in version <xsl:value-of select= "@version" />
and later.</i>
</p>
</xsl:template>
<xsl:template name= "GetLinkTargetHtml" >
<xsl:param name= "type" />
<xsl:param name= "cref" />
<xsl:variable name= "href" >
<xsl:call-template name= "GetLinkTarget" >
<xsl:with-param name= "type" select= "$type" />
<xsl:with-param name= "cref" select= "$cref" />
</xsl:call-template>
</xsl:variable>
<xsl:choose >
<xsl:when test= "string($href) = ''" >
<xsl:text > javascript:alert("Documentation not found.")</xsl:text>
</xsl:when>
<xsl:otherwise > <xsl:value-of select= "$href" /> </xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>