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 8:05:04 PM (W. Europe Standard Time, UTC+01: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!
On this page....
<November 2008>
SunMonTueWedThuFriSat
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

SUBSCRIBE RSS GeoURL e-mail

Search
Categories
Blogroll
[Feed] Dare Obasanjo
Dare Obasanjo aka Carnage4Life
[Feed] Clemens Vasters
[Feed] Omar Shahine
[Feed] Tom Mertens

newtelligence dasBlog 2.1.8102.813

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

WOT Notar

Join WebHost4Life.com