Math.NET Numerics
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

207 lines
9.3 KiB

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1">
<xsl:param name="projectName" />
<xsl:param name="maxProjectNameLength" select="49" /> <!-- default provided by paorear, bug 230840 -->
<xsl:variable name="leftLength" select="$maxProjectNameLength div 2 - 1" />
<xsl:variable name="rightLength" select="$maxProjectNameLength - $leftLength - 2" />
<xsl:variable name="projectPrefix">
<xsl:if test="boolean($projectName)">
<xsl:value-of select="concat($projectName,'_')"/>
</xsl:if>
</xsl:variable>
<xsl:output indent="yes" encoding="UTF-8" />
<xsl:key name="index" match="/reflection/apis/api" use="@id" />
<xsl:template match="/">
<topics>
<xsl:choose>
<xsl:when test="count(/reflection/apis/api[apidata/@group='root']) > 0">
<xsl:apply-templates select="/reflection/apis/api[apidata/@group='root']" />
</xsl:when>
<xsl:when test="count(/reflection/apis/api[topicdata/@group='root']) > 0">
<xsl:apply-templates select="/reflection/apis/api[topicdata/@group='root']" />
</xsl:when>
<xsl:when test="count(/reflection/apis/api[apidata/@group='namespace']) > 0">
<xsl:apply-templates select="/reflection/apis/api[apidata/@group='namespace']">
<xsl:sort select="apidata/@name" />
</xsl:apply-templates>
</xsl:when>
<xsl:when test="count(/reflection/apis/api[apidata/@group='type']) > 0">
<xsl:apply-templates select="/reflection/apis/api[apidata/@group='type'][topicdata[@group='api']]">
<xsl:sort select="@id" />
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="/reflection/apis/api[apidata/@group='member']">
<xsl:sort select="@id" />
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</topics>
</xsl:template>
<!-- create a root entry and namespace sub-entries -->
<xsl:template match="api[apidata/@group='root'] | api[topicdata/@group='root']">
<topic id="{@id}" project="{$projectName}" file="{file/@name}">
<xsl:apply-templates select="key('index',elements/element/@api)">
<xsl:sort select="apidata/@name" />
</xsl:apply-templates>
</topic>
</xsl:template>
<!-- for each namespace, create namespace entry and type sub-entries -->
<xsl:template match="api[apidata/@group='namespace']">
<topic id="{@id}" project="{$projectName}_Namespaces" file="{file/@name}">
<xsl:apply-templates select="key('index',elements/element/@api)">
<xsl:sort select="@id" />
</xsl:apply-templates>
</topic>
</xsl:template>
<!-- logic to shorten component names if needed -->
<xsl:template name="GetComponentName">
<xsl:param name="initialName" select="containers/library/@assembly" />
<xsl:variable name="componentNameLength" select="string-length($initialName)" />
<xsl:choose>
<xsl:when test="$componentNameLength > $maxProjectNameLength">
<xsl:variable name="left" select="substring($initialName, 1, $leftLength)" />
<xsl:variable name="right" select="substring($initialName, $componentNameLength - $rightLength)" />
<xsl:value-of select="concat($left,'_',$right)" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$initialName" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- for each type, create type entry and either overload entries or member entries as sub-entries -->
<xsl:template match="api[apidata/@group='type'][topicdata[@group='api']]">
<xsl:variable name="componentName">
<xsl:call-template name="GetComponentName">
<xsl:with-param name="initialName" select="concat($projectPrefix,containers/library/@assembly)" />
</xsl:call-template>
</xsl:variable>
<topic id="{@id}" project="{$componentName}" file="{file/@name}">
<xsl:call-template name="AddMemberListTopics"/>
</topic>
</xsl:template>
<!-- For class, struct, and interface, insert nodes for the member list topics,
and insert nodes for the declared member topics under the appropriate list topic. -->
<xsl:template name="AddMemberListTopics">
<xsl:variable name="typeId" select="@id" />
<xsl:variable name="declaredPrefix" select="concat(substring($typeId,3), '.')"/>
<xsl:variable name="componentName">
<xsl:call-template name="GetComponentName">
<xsl:with-param name="initialName" select="concat($projectPrefix,containers/library/@assembly)" />
</xsl:call-template>
</xsl:variable>
<xsl:if test="apidata[@subgroup='class' or @subgroup='structure' or @subgroup='interface']">
<!-- insert the all members topic, if present -->
<xsl:for-each select="key('index', topicdata/@allMembersTopicId)">
<topic id="{@id}" project="{$componentName}" file="{file/@name}"/>
</xsl:for-each>
<!-- insert constructors -->
<!-- the context now is the type's api node, which has an element list in vsorcas docmodel, but not in vs2005 -->
<xsl:choose>
<xsl:when test="topicdata/@allMembersTopicId">
<xsl:for-each select="key('index', key('index', topicdata/@allMembersTopicId)/elements/*[starts-with(substring-after(@api,':'), $declaredPrefix)]/@api)[apidata[@subgroup='constructor']]">
<xsl:call-template name="AddMember">
<xsl:with-param name="declaredPrefix" select="$declaredPrefix"/>
</xsl:call-template>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="key('index', elements/*[starts-with(substring-after(@api,':'), $declaredPrefix)]/@api)[apidata[@subgroup='constructor']]">
<xsl:call-template name="AddMember">
<xsl:with-param name="declaredPrefix" select="$declaredPrefix"/>
</xsl:call-template>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
<!-- insert the Fields topic, if present -->
<xsl:for-each select="key('index', concat('Fields.', $typeId))">
<xsl:call-template name="AddMemberListTree"/>
</xsl:for-each>
<!-- insert the Methods topic, if present -->
<xsl:for-each select="key('index', concat('Methods.', $typeId))">
<xsl:call-template name="AddMemberListTree"/>
</xsl:for-each>
<!-- insert the Properties topic, if present -->
<xsl:for-each select="key('index', concat('Properties.', $typeId))">
<xsl:call-template name="AddMemberListTree"/>
</xsl:for-each>
<!-- insert the Events topic, if present -->
<xsl:for-each select="key('index', concat('Events.', $typeId))">
<xsl:call-template name="AddMemberListTree"/>
</xsl:for-each>
<!-- insert the AttachedProperties topic, if present -->
<xsl:for-each select="key('index', concat('AttachedProperties.', $typeId))">
<xsl:call-template name="AddMemberListTree"/>
</xsl:for-each>
<!-- insert the AttachedEvents topic, if present -->
<xsl:for-each select="key('index', concat('AttachedEvents.', $typeId))">
<xsl:call-template name="AddMemberListTree"/>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template name="AddMemberListTree">
<xsl:variable name="componentName">
<xsl:call-template name="GetComponentName">
<xsl:with-param name="initialName" select="concat($projectPrefix,containers/library/@assembly)" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name="declaredPrefix" select="concat(substring(topicdata/@typeTopicId,3), '.')"/>
<topic id="{@id}" project="{$componentName}" file="{file/@name}">
<!-- recurse to get declared child element topics, if any -->
<xsl:for-each select="key('index', elements/*[starts-with(substring-after(@api,':'), $declaredPrefix)]/@api)">
<!-- sort the elements in a member list topic by name -->
<xsl:sort select="topicdata/@eiiName | apidata/@name" />
<xsl:call-template name="AddMember">
<xsl:with-param name="declaredPrefix" select="$declaredPrefix"/>
</xsl:call-template>
</xsl:for-each>
</topic>
</xsl:template>
<xsl:template name="AddMember">
<xsl:param name="declaredPrefix" />
<xsl:variable name="componentName">
<xsl:call-template name="GetComponentName">
<xsl:with-param name="initialName" select="concat($projectPrefix,containers/library/@assembly)" />
</xsl:call-template>
</xsl:variable>
<topic id="{@id}" project="{$componentName}" file="{file/@name}">
<!-- loop throught the declared elements, if any, which are already pre-sorted by the ApplyVsDocModel transform;
if you were to loop through the key('index', elements) as in the AddMemberListTree template,
you'd lose the pre-sort and get the order of apis in the document
-->
<xsl:for-each select="elements/*[starts-with(substring-after(@api,':'), $declaredPrefix)]">
<xsl:for-each select="key('index',@api)">
<xsl:call-template name="AddMember">
<xsl:with-param name="declaredPrefix" select="$declaredPrefix"/>
</xsl:call-template>
</xsl:for-each>
</xsl:for-each>
</topic>
</xsl:template>
<!-- if only members are present, create toc entries for them (this should never be a visible toc) -->
<xsl:template match="api[apidata/@group='member']">
<topic id="{@id}" project="{$projectName}" file="{file/@name}" />
</xsl:template>
</xsl:stylesheet>