torsten's .NET blog In the end, everything is a gag [Ch. Chaplin]
# Friday, December 01, 2006
Strange XSL Transform Exception - figured out

Recently we migrated our software dev. to use CLR 2.0. One part of the migration was to rework the usage of XslTransform class to the new XslCompiledTransform class. Reading the "Migrating From the XslTransform class" MSDN paper, it was not much work, just minutes. But then I got this strange exception:

Cannot transform XML using stylesheet 'transform.xslt.'
Exception: Extension function parameters or return values which have Clr type 'ConcatString' are not supported.

This really took me a half day to track it down! First, I did the usual things like reading more carefully the MSDN docs (my wrong direction: security issues), google'd for it and found at least one topic about. This was the right direction to solve it, but I tried various other things to get around - inclusive a complete redesign of the transformation code not using any stylesheet scripts. At last I was more confused (introduced other errors) than as I started, so I reverted the most unrelated changes. After reading the more interesting post "Introducing XslCompiledTransform" and IM'ed with a OS project coworker it gets more clear to me what happens: the System.Xml.Xsl.Runtime.XmlQueryRuntime.ChangeTypeXsltResult(XmlQueryType xmlType, Object value) visible in the call stack try to make my <msxsl:script language="JScript" ...> functions to return strong types - but: only the top level functions called from XSL element! Here is the non-working stylesheet code sample:

<msxsl:script language="JScript" implements-prefix="local"><![CDATA[
   
    function fmtDate(val, fmtmask)
    {

   var s = "" + val; 
   ...
   return formatDate(new Date(s.substring(0,4),s.substring(4,6)-1,s.substring(6,8)), fmtmask);
    }
    function formatDate(varDate, bstrFormat)
    {
...
return "" + formattedDate;
}
]]></msxsl:script>

And this is the working one:

<msxsl:script language="JScript" implements-prefix="local"><![CDATA[
   
    function fmtDate(val, fmtmask)
    {

   var s = "" + val; 
   ...
   return "" + formatDate(new Date(s.substring(0,4),s.substring(4,6)-1,s.substring(6,8)), fmtmask);
    }
    function formatDate(varDate, bstrFormat)
    {
...
return "" + formattedDate;
}
]]></msxsl:script>

You notice the small but important difference? Now the stylesheet compiler consider my return value correctly as a string. Whoa...

Technorati tags:  | 
Friday, December 01, 2006 8:58:49 AM (W. Europe Standard Time, UTC+01:00)    #  Comments [1]  | 
Wednesday, May 23, 2007 9:05:04 PM (W. Europe Daylight Time, UTC+02:00)
Thanks Torsten!

I was having exactly the same issue... upgrading an app to clr 2.0 and facing the XSLT with inline javascript was no longer working.

Best regards,
Hèctor
Comments are closed.
Navigation

Like RSS Bandit? Make a donation to help support its development and maintenance. As little as 1€ will help.

Make payments with PayPal - it's fast, free and secure!
Site supporters
On this page....
<February 2012>
SunMonTueWedThuFriSat
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

SUBSCRIBE RSS GeoURL e-mail

Search
Categories
Blogroll

newtelligence dasBlog 2.3.9074.18820

The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

Join WebHost4Life.com