tags:

views:

31

answers:

2

Hi I'm new to xslt. I tried using urn:helper in the stylesheet tag. But it throws the following error.
"Cannot find the script or external object that implements prefix 'urn:Helper'".

Below is the snippet used in my code.


xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:myObj="urn:Helper"
xmlns:t="http://microsoft.com/schemas/VisualStudio/TeamTest/2006"

Am I missing something?

Thanks..

edit: complete stylesheet

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:myObj="urn:Helper"
xmlns:t="http://microsoft.com/schemas/VisualStudio/TeamTest/2006"&gt;
  <xsl:param name="today"></xsl:param>
  <xsl:param name="results"></xsl:param>
  <xsl:param name="pass" select="'Passed'"/>
  <xsl:param name="fail" select="'Failed'"/>
  <xsl:key name="class-key" match="@className" use="."/>
  <xsl:variable name="unique-classes" select="//t:TestMethod/@className[generate-id(.) =generate-id(key('class-key',.))]" />  
  <xsl:template match="/">

    <html>
      <body style="font-family:Verdana; font-size:10pt">
        <h1>Test Results Summary</h1>
            <table style="font-family:Verdana; font-size:10pt">
      <tr>
        <td>
          <b>Run Date/Time</b>
        </td>
        <td>
        </td>
      </tr>
      <tr>
        <td>
          Start Time:
        </td>
        <td>
              <xsl:value-of select="myObj:DateTimeToString(//t:TestRun/t:Times/@start)"/>
        </td>
      </tr>
      <tr>
        <td>
          End Time:
        </td>
        <td>
              <xsl:value-of select="myObj:DateTimeToString(//t:TestRun/t:Times/@finish)"/>
        </td>
      </tr>
      <tr>
          <td>
          Duration: 
          </td>
          <td>
                <xsl:value-of select="myObj:TimeSpan(//t:TestRun/t:Times/@start,//t:TestRun/t:Times/@finish)"/>
        </td>

      </tr>
      <tr>
        <td>
          <b>Results File</b>
        </td>
        <td>
              <xsl:value-of select="$results"/>
        </td>
      </tr>
    </table>
    <a href="coverage.htm">Coverage Summary</a>
    <xsl:call-template name="summary" />
      <!--<xsl:call-template name="details" />-->
      <xsl:call-template name="details2" />
  </body>
</html>
  </xsl:template>

  <xsl:template name="summary">
    <h3>Test Summary</h3>
    <table style="width:640;border:1px solid black;font-family:Verdana; font-size:10pt">
  <tr>
    <td style="font-weight:bold">Total</td>
    <td style="font-weight:bold">Failed</td>
    <td style="font-weight:bold">Passed</td>
    <td style="font-weight:bold">Inconclusive</td>
  </tr>

  <tr>
    <td >
      <xsl:value-of select="/t:TestRun/t:ResultSummary/t:Counters/@total"/>
    </td>
    <td style="background-color:pink;">
      <xsl:value-of select="/t:TestRun/t:ResultSummary/t:Counters/@failed"/>
    </td>
    <td style="background-color:lightgreen;">
      <xsl:value-of select="/t:TestRun/t:ResultSummary/t:Counters/@passed"/>
    </td>
    <td style="background-color:yellow;">
      <xsl:value-of select="/t:TestRun/t:ResultSummary/t:Counters/@inconclusive"/>
    </td>
  </tr>
</table>

  </xsl:template>

  <xsl:template name="details">

<h3>Unit Test Results</h3>
<table style="width:640;border:1px solid black;font-family:Verdana; font-size:10pt;">
  <tr>
    <td style="font-weight:bold">Test Name</td>
    <td style="font-weight:bold">Result</td>
    <td style="font-weight:bold">Duration</td>
  </tr>
  <xsl:for-each select="/t:TestRun/t:Results/t:UnitTestResult">
    <xsl:sort select="@testName"/>
    <tr>
      <xsl:attribute name="style">
        <xsl:choose>
          <xsl:when test="@outcome='Failed'">background-color:pink;</xsl:when>
          <xsl:when test="@outcome='Passed'">background-color:lightgreen;</xsl:when>
          <xsl:otherwise>background-color:yellow;</xsl:otherwise>
        </xsl:choose>
      </xsl:attribute>
      <td>
        <xsl:value-of select="@testName"/>
      </td>
      <td>
        <xsl:choose>
          <xsl:when test="@outcome='Failed'">FAILED</xsl:when>
          <xsl:when test="@outcome='Passed'">Passed</xsl:when>
          <xsl:otherwise>Inconclusive</xsl:otherwise>
        </xsl:choose>
      </td>
      <td>
        <xsl:value-of select="@duration"/>
      </td>
    </tr>
  </xsl:for-each>
</table>
  </xsl:template>

  <xsl:template name="details2">

<h3>Unit Test Results</h3>
<table border="0" style="width:640;border:1px solid black;font-family:Verdana; font-size:10pt;">
  <xsl:for-each select="$unique-classes">
    <xsl:sort />
    <xsl:variable name="curClass" select="."/>
    <xsl:variable name="return" select="myObj:GetClassInformation($curClass)"/>
    <!--<xsl:for-each select="//TestRun/tests/value/testMethod[className=$curClass]">-->

    <tr>
      <td valign="bottom" style="background-color:beige;font-weight:bold;" colspan="3">
        <font>
          <xsl:value-of select="concat('',$return/className)"/>
        </font>
      </td>
    </tr>
    <tr>
      <td style="font-weight:bold">Test Name</td>
      <td style="font-weight:bold">Result</td>
      <td style="font-weight:bold">Duration</td>
    </tr>
      <xsl:for-each select="//t:UnitTest/t:TestMethod[@className=$curClass]">
      <xsl:sort select="@name"/>
      <xsl:variable name="testid" select="../@id"/>
      <xsl:for-each select="//t:UnitTestResult[@testId=$testid]">
        <xsl:call-template name="classRunsDetail">
        <xsl:with-param name="testid" select="."/>
      </xsl:call-template>
      </xsl:for-each>
    </xsl:for-each>
    <tr>
      <td style="border-bottom:0px solid black;height:1px;background-color:black" colspan="3"></td>
    </tr>

  </xsl:for-each>
</table>      
  </xsl:template>

  <xsl:template name="classRunsDetail">
    <xsl:param name="testid"/>
    <tr>
      <xsl:attribute name="style">
        <xsl:choose>
          <xsl:when test="@outcome = $fail">background-color:pink;</xsl:when>
          <xsl:when test="@outcome = $pass">background-color:lightgreen;</xsl:when>
          <xsl:otherwise>background-color:yellow;</xsl:otherwise>
        </xsl:choose>
      </xsl:attribute>
      <td>
        <xsl:value-of select="@testName"/>
      </td>
      <td>
        <xsl:choose>
          <xsl:when test="@outcome = $fail">FAILED</xsl:when>
          <xsl:when test="@outcome = $pass">Passed</xsl:when>
          <xsl:otherwise>Inconclusive</xsl:otherwise>
        </xsl:choose>
      </td>
      <td>
        <xsl:value-of select="@duration"/>
      </td>
    </tr>

  </xsl:template>

</xsl:stylesheet>
A: 

I see you grabbed that little helper object from this post. It seems right, but make sure you are using the C# code to actually do the transform.

Meiscooldude
Well I'm actually working on an xsl that already exists. This file does not throw errors when running with the nightly builds on the build server.. But when I run it locally on my system, it throws the error.
Sidd
@Sidd Then you don't have compiled and integrated on your local system the file that contains the implementation of the extension function. On the other side, this file *is* included in the build performed on the build server.
Dimitre Novatchev
+1  A: 

There is no problem with your xsl:stylesheet element.

The problem is here:

<xsl:value-of select="myObj:DateTimeToString(//t:TestRun/t:Times/@start)"/> 

From http://www.w3.org/TR/xslt#section-Extension-Functions

If a FunctionName in a FunctionCall expression is not an NCName (i.e. if it contains a colon), then it is treated as a call to an extension function. The FunctionName is expanded to a name using the namespace declarations from the evaluation context.

If the XSLT processor does not have an implementation of an extension function of a particular name available, then the function-available function must return false for that name. If such an extension function occurs in an expression and the extension function is actually called, the XSLT processor must signal an error.

The answer: You are missing the extension function implementation.

So, you must provide details of your processor and re-ask what is the specific way that your processor is linked to the implementation of extended functions.

Alejandro
+1 for the detailed and correct explanation.
Dimitre Novatchev