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.

559 lines
21 KiB

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output omit-xml-declaration="yes"/>
<!-- Keys -->
<xsl:key name="ProjectKey" match="Event" use="@Project"/>
<!-- String split template -->
<xsl:template name="SplitString">
<xsl:param name="source" select="''"/>
<xsl:param name="separator" select="','"/>
<xsl:if test="not($source = '' or $separator = '')">
<xsl:variable name="head" select="substring-before(concat($source, $separator), $separator)"/>
<xsl:variable name="tail" select="substring-after($source, $separator)"/>
<part>
<xsl:value-of select="$head"/>
</part>
<xsl:call-template name="SplitString">
<xsl:with-param name="source" select="$tail"/>
<xsl:with-param name="separator" select="$separator"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- Intermediate Templates -->
<xsl:template match="UpgradeReport" mode="ProjectOverviewXML">
<Projects>
<xsl:for-each select="Event[generate-id(.) = generate-id(key('ProjectKey', @Project))]">
<Project>
<xsl:variable name="pNode" select="current()"/>
<xsl:variable name="errorCount" select="count(../Event[@Project = current()/@Project and @ErrorLevel=2])"/>
<xsl:variable name="warningCount" select="count(../Event[@Project = current()/@Project and @ErrorLevel=1])"/>
<xsl:variable name="messageCount" select="count(../Event[@Project = current()/@Project and @ErrorLevel=0])"/>
<xsl:variable name="pathSplitSeparator">
<xsl:text>\</xsl:text>
</xsl:variable>
<xsl:variable name="projectName">
<xsl:choose>
<xsl:when test="@Project = ''">Solution</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@Project"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:attribute name="IsSolution">
<xsl:value-of select="@Project = ''"/>
</xsl:attribute>
<xsl:attribute name="Project">
<xsl:value-of select="$projectName"/>
</xsl:attribute>
<xsl:attribute name="ProjectDisplayName">
<xsl:variable name="localProjectName" select="@Project"/>
<!-- Sometimes it is possible to have project name set to a path over a real project name,
we split the string on '\' and if we end up with >1 part in the resulting tokens set
we format the ProjectDisplayName as ..\prior\last -->
<xsl:variable name="pathTokens">
<xsl:call-template name="SplitString">
<xsl:with-param name="source" select="$localProjectName"/>
<xsl:with-param name="separator" select="$pathSplitSeparator"/>
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="count(msxsl:node-set($pathTokens)/part) &gt; 1">
<xsl:value-of select="concat('..', $pathSplitSeparator, msxsl:node-set($pathTokens)/part[last() - 1], $pathSplitSeparator, msxsl:node-set($pathTokens)/part[last()])"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$localProjectName"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:attribute name="ProjectSafeName">
<xsl:value-of select="translate($projectName, '\', '-')"/>
</xsl:attribute>
<xsl:attribute name="Solution">
<xsl:value-of select="/UpgradeReport/Properties/Property[@Name='Solution']/@Value"/>
</xsl:attribute>
<xsl:attribute name="Source">
<xsl:value-of select="@Source"/>
</xsl:attribute>
<xsl:attribute name="Status">
<xsl:choose>
<xsl:when test="$errorCount &gt; 0">Error</xsl:when>
<xsl:when test="$warningCount &gt; 0">Warning</xsl:when>
<xsl:otherwise>Success</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:attribute name="ErrorCount">
<xsl:value-of select="$errorCount"/>
</xsl:attribute>
<xsl:attribute name="WarningCount">
<xsl:value-of select="$warningCount"/>
</xsl:attribute>
<xsl:attribute name="MessageCount">
<xsl:value-of select="$messageCount"/>
</xsl:attribute>
<xsl:attribute name="TotalCount">
<xsl:value-of select="$errorCount + $warningCount + $messageCount"/>
</xsl:attribute>
<xsl:for-each select="../Event[@Project = $pNode/@Project and @ErrorLevel=3]">
<ConversionStatus>
<xsl:value-of select="@Description"/>
</ConversionStatus>
</xsl:for-each>
<Messages>
<xsl:for-each select="../Event[@Project = $pNode/@Project and @ErrorLevel&lt;3]">
<Message>
<xsl:attribute name="Level">
<xsl:value-of select="@ErrorLevel"/>
</xsl:attribute>
<xsl:attribute name="Status">
<xsl:choose>
<xsl:when test="@ErrorLevel = 0">Message</xsl:when>
<xsl:when test="@ErrorLevel = 1">Warning</xsl:when>
<xsl:when test="@ErrorLevel = 2">Error</xsl:when>
<xsl:otherwise>Message</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:attribute name="Source">
<xsl:value-of select="@Source"/>
</xsl:attribute>
<xsl:attribute name="Message">
<xsl:value-of select="@Description"/>
</xsl:attribute>
</Message>
</xsl:for-each>
</Messages>
</Project>
</xsl:for-each>
</Projects>
</xsl:template>
<!-- Project Overview template -->
<xsl:template match="Projects" mode="ProjectOverview">
<table>
<tr>
<th></th>
<th _locID="ProjectTableHeader">项目</th>
<th _locID="PathTableHeader">路径</th>
<th _locID="ErrorsTableHeader">错误</th>
<th _locID="WarningsTableHeader">警告</th>
<th _locID="MessagesTableHeader">消息</th>
</tr>
<xsl:for-each select="Project">
<xsl:sort select="@ErrorCount" order="descending"/>
<xsl:sort select="@WarningCount" order="descending"/>
<!-- Always make solution last within a group -->
<xsl:sort select="@IsSolution" order="ascending"/>
<xsl:sort select="@ProjectSafeName" order="ascending"/>
<tr>
<td>
<img width="16" height="16">
<xsl:attribute name="src">
<xsl:choose>
<xsl:when test="@Status = 'Error'">_UpgradeReport_Files\UpgradeReport_Error.png</xsl:when>
<xsl:when test="@Status = 'Warning'">_UpgradeReport_Files\UpgradeReport_Warning.png</xsl:when>
<xsl:when test="@Status = 'Success'">_UpgradeReport_Files\UpgradeReport_Success.png</xsl:when>
</xsl:choose>
</xsl:attribute>
<xsl:attribute name="alt">
<xsl:value-of select="@Status"/>
</xsl:attribute>
</img>
</td>
<td>
<strong>
<a>
<xsl:attribute name="href">
<xsl:value-of select="concat('#', @ProjectSafeName)"/>
</xsl:attribute>
<xsl:choose>
<xsl:when test="@ProjectDisplayName = ''">
<span _locID="OverviewSolutionSpan">解决方案</span>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@ProjectDisplayName"/>
</xsl:otherwise>
</xsl:choose>
</a>
</strong>
</td>
<td>
<xsl:value-of select="@Source"/>
</td>
<td class="textCentered">
<a>
<xsl:if test="@ErrorCount &gt; 0">
<xsl:attribute name="href">
<xsl:value-of select="concat('#', @ProjectSafeName, 'Error')"/>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="@ErrorCount"/>
</a>
</td>
<td class="textCentered">
<a>
<xsl:if test="@WarningCount &gt; 0">
<xsl:attribute name="href">
<xsl:value-of select="concat('#', @ProjectSafeName, 'Warning')"/>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="@WarningCount"/>
</a>
</td>
<td class="textCentered">
<a href="#">
<xsl:if test="@MessageCount &gt; 0">
<xsl:attribute name="onclick">
<xsl:variable name="apos">
<xsl:text>'</xsl:text>
</xsl:variable>
<xsl:variable name="JS" select="concat('ScrollToFirstVisibleMessage(', $apos, @ProjectSafeName, $apos, ')')"/>
<xsl:value-of select="concat($JS, '; return false;')"/>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="@MessageCount"/>
</a>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
<!-- Show messages row -->
<xsl:template match="Project" mode="ProjectShowMessages">
<tr>
<xsl:attribute name="name">
<xsl:value-of select="concat('MessageRowHeaderShow', @ProjectSafeName)"/>
</xsl:attribute>
<td>
<img width="16" height="16" src="_UpgradeReport_Files\UpgradeReport_Information.png"/>
</td>
<td class="messageCell">
<xsl:variable name="apos">
<xsl:text>'</xsl:text>
</xsl:variable>
<xsl:variable name="toggleRowsJS" select="concat('ToggleMessageVisibility(', $apos, @ProjectSafeName, $apos, ')')"/>
<a _locID="ShowAdditionalMessages" href="#">
<xsl:attribute name="name">
<xsl:value-of select="concat(@ProjectSafeName, 'Message')"/>
</xsl:attribute>
<xsl:attribute name="onclick">
<xsl:value-of select="concat($toggleRowsJS, '; return false;')"/>
</xsl:attribute>
显示 <xsl:value-of select="@MessageCount"/> 其他消息
</a>
</td>
</tr>
</xsl:template>
<!-- Hide messages row -->
<xsl:template match="Project" mode="ProjectHideMessages">
<tr style="display: none">
<xsl:attribute name="name">
<xsl:value-of select="concat('MessageRowHeaderHide', @ProjectSafeName)"/>
</xsl:attribute>
<td>
<img width="16" height="16" src="_UpgradeReport_Files\UpgradeReport_Information.png"/>
</td>
<td class="messageCell">
<xsl:variable name="apos">
<xsl:text>'</xsl:text>
</xsl:variable>
<xsl:variable name="toggleRowsJS" select="concat('ToggleMessageVisibility(', $apos, @ProjectSafeName, $apos, ')')"/>
<a _locID="HideAdditionalMessages" href="#">
<xsl:attribute name="name">
<xsl:value-of select="concat(@ProjectSafeName, 'Message')"/>
</xsl:attribute>
<xsl:attribute name="onclick">
<xsl:value-of select="concat($toggleRowsJS, '; return false;')"/>
</xsl:attribute>
隐藏 <xsl:value-of select="@MessageCount"/> 其他消息
</a>
</td>
</tr>
</xsl:template>
<!-- Message row templates -->
<xsl:template match="Message">
<tr>
<xsl:attribute name="name">
<xsl:value-of select="concat(@Status, 'RowClass', ../../@ProjectSafeName)"/>
</xsl:attribute>
<xsl:if test="@Level = 0">
<xsl:attribute name="style">display: none</xsl:attribute>
</xsl:if>
<td>
<a>
<xsl:attribute name="name">
<xsl:value-of select="concat(../../@ProjectSafeName, @Status)"/>
</xsl:attribute>
</a>
<img width="16" height="16">
<xsl:attribute name="src">
<xsl:choose>
<xsl:when test="@Status = 'Error'">_UpgradeReport_Files\UpgradeReport_Error.png</xsl:when>
<xsl:when test="@Status = 'Warning'">_UpgradeReport_Files\UpgradeReport_Warning.png</xsl:when>
<xsl:when test="@Status = 'Message'">_UpgradeReport_Files\UpgradeReport_Information.png</xsl:when>
</xsl:choose>
</xsl:attribute>
<xsl:attribute name="alt">
<xsl:value-of select="@Status"/>
</xsl:attribute>
</img>
</td>
<td class="messageCell">
<strong>
<xsl:value-of select="@Source"/>:
</strong>
<span>
<xsl:value-of select="@Message"/>
</span>
</td>
</tr>
</xsl:template>
<!-- Project Details Template -->
<xsl:template match="Projects" mode="ProjectDetails">
<xsl:for-each select="Project">
<xsl:sort select="@ErrorCount" order="descending"/>
<xsl:sort select="@WarningCount" order="descending"/>
<!-- Always make solution last within a group -->
<xsl:sort select="@IsSolution" order="ascending"/>
<xsl:sort select="@ProjectSafeName" order="ascending"/>
<a>
<xsl:attribute name="name">
<xsl:value-of select="@ProjectSafeName"/>
</xsl:attribute>
</a>
<xsl:choose>
<xsl:when test="@ProjectDisplayName = ''">
<h3 _locID="ProjectDisplayNameHeader">解决方案</h3>
</xsl:when>
<xsl:otherwise>
<h3>
<xsl:value-of select="@ProjectDisplayName"/>
</h3>
</xsl:otherwise>
</xsl:choose>
<table>
<tr>
<xsl:attribute name="id">
<xsl:value-of select="concat(@ProjectSafeName, 'HeaderRow')"/>
</xsl:attribute>
<th></th>
<th class="messageCell" _locID="MessageTableHeader">消息</th>
</tr>
<!-- Errors and warnings -->
<xsl:for-each select="Messages/Message[@Level &gt; 0]">
<xsl:sort select="@Level" order="descending"/>
<xsl:apply-templates select="."/>
</xsl:for-each>
<xsl:if test="@MessageCount &gt; 0">
<xsl:apply-templates select="." mode="ProjectShowMessages"/>
</xsl:if>
<!-- Messages -->
<xsl:for-each select="Messages/Message[@Level = 0]">
<xsl:apply-templates select="."/>
</xsl:for-each>
<xsl:choose>
<!-- Additional row as a 'place holder' for 'Show/Hide' additional messages -->
<xsl:when test="@MessageCount &gt; 0">
<xsl:apply-templates select="." mode="ProjectHideMessages"/>
</xsl:when>
<!-- No messages at all, show blank row -->
<xsl:when test="@TotalCount = 0">
<tr>
<td>
<img width="16" height="16" src="_UpgradeReport_Files\UpgradeReport_Information.png"/>
</td>
<xsl:choose>
<xsl:when test="@ProjectDisplayName = ''">
<td class="messageCell" _locID="NoMessagesRow2">
解决方案未记录任何消息。
</td>
</xsl:when>
<xsl:otherwise>
<td class="messageCell" _locID="NoMessagesRow">
<xsl:value-of select="@ProjectDisplayName"/> 未记录任何消息。
</td>
</xsl:otherwise>
</xsl:choose>
</tr>
</xsl:when>
</xsl:choose>
</table>
</xsl:for-each>
</xsl:template>
<!-- Document, matches "UpgradeReport" -->
<xsl:template match="UpgradeReport">
<!-- Output doc type the 'Mark of the web' which disabled prompting to run JavaScript from local HTML Files in IE -->
<!-- NOTE: The whitespace around the 'Mark of the web' is important it must be exact -->
<xsl:text disable-output-escaping="yes"><![CDATA[<!DOCTYPE html>
<!-- saved from url=(0014)about:internet -->
]]>
</xsl:text>
<html>
<head>
<meta content="en-us" http-equiv="Content-Language"/>
<meta content="text/html; charset=utf-16" http-equiv="Content-Type"/>
<link type="text/css" rel="stylesheet" href="_UpgradeReport_Files\UpgradeReport.css"/>
<title _locID="ConversionReport0">
迁移报告
</title>
<script type="text/javascript" language="javascript">
<xsl:text disable-output-escaping="yes">
<![CDATA[
// Startup
// Hook up the the loaded event for the document/window, to linkify the document content
var startupFunction = function() { linkifyElement("messages"); };
if(window.attachEvent)
{
window.attachEvent('onload', startupFunction);
}
else if (window.addEventListener)
{
window.addEventListener('load', startupFunction, false);
}
else
{
document.addEventListener('load', startupFunction, false);
}
// Toggles the visibility of table rows with the specified name
function toggleTableRowsByName(name)
{
var allRows = document.getElementsByTagName('tr');
for (i=0; i < allRows.length; i++)
{
var currentName = allRows[i].getAttribute('name');
if(!!currentName && currentName.indexOf(name) == 0)
{
var isVisible = allRows[i].style.display == '';
isVisible ? allRows[i].style.display = 'none' : allRows[i].style.display = '';
}
}
}
function scrollToFirstVisibleRow(name)
{
var allRows = document.getElementsByTagName('tr');
for (i=0; i < allRows.length; i++)
{
var currentName = allRows[i].getAttribute('name');
var isVisible = allRows[i].style.display == '';
if(!!currentName && currentName.indexOf(name) == 0 && isVisible)
{
allRows[i].scrollIntoView(true);
return true;
}
}
return false;
}
// Linkifies the specified text content, replaces candidate links with html links
function linkify(text)
{
if(!text || 0 === text.length)
{
return text;
}
// Find http, https and ftp links and replace them with hyper links
var urlLink = /(http|https|ftp)\:\/\/[a-zA-Z0-9\-\.]+(:[a-zA-Z0-9]*)?\/?([a-zA-Z0-9\-\._\?\,\/\\\+&%\$#\=~;\{\}])*/gi;
return text.replace(urlLink, '<a href="$&">$&</a>') ;
}
// Linkifies the specified element by ID
function linkifyElement(id)
{
var element = document.getElementById(id);
if(!!element)
{
element.innerHTML = linkify(element.innerHTML);
}
}
function ToggleMessageVisibility(projectName)
{
if(!projectName || 0 === projectName.length)
{
return;
}
toggleTableRowsByName("MessageRowClass" + projectName);
toggleTableRowsByName('MessageRowHeaderShow' + projectName);
toggleTableRowsByName('MessageRowHeaderHide' + projectName);
}
function ScrollToFirstVisibleMessage(projectName)
{
if(!projectName || 0 === projectName.length)
{
return;
}
// First try the 'Show messages' row
if(!scrollToFirstVisibleRow('MessageRowHeaderShow' + projectName))
{
// Failed to find a visible row for 'Show messages', try an actual message row
scrollToFirstVisibleRow('MessageRowClass' + projectName);
}
}
]]>
</xsl:text>
</script>
</head>
<body>
<h1 _locID="ConversionReport">
迁移报告 - <xsl:value-of select="Properties/Property[@Name='Solution']/@Value"/>
</h1>
<div id="content">
<h2 _locID="OverviewTitle">概述</h2>
<xsl:variable name="projectOverview">
<xsl:apply-templates select="self::node()" mode="ProjectOverviewXML"/>
</xsl:variable>
<div id="overview">
<xsl:apply-templates select="msxsl:node-set($projectOverview)/*" mode="ProjectOverview"/>
</div>
<h2 _locID="SolutionAndProjectsTitle">解决方案和项目</h2>
<div id="messages">
<xsl:apply-templates select="msxsl:node-set($projectOverview)/*" mode="ProjectDetails"/>
</div>
</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>