Re: [xsl] Problem sending node Array to Javascript using .NET xsl/xml parse r

Subject: Re: [xsl] Problem sending node Array to Javascript using .NET xsl/xml parse r
From: Mulberry Technologies List Owner <xsl-list-owner@xxxxxxxxxxxxxxxxxxxxxx>
Date: Tue, 21 Oct 2003 17:17:56 -0400
>From: "M. David Peterson" <conners_dad@xxxxxxx>
>To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
>References: <1303AA14B8B7844FBE1F1810ECCD8098DC2E44@xxxxxxxxxxxxxxxxxxxxxxx>
>Subject: Re: [xsl] Problem sending node Array to Javascript using .NET xsl/xml parse r
>Date: Tue, 21 Oct 2003 00:36:48 -0600
>
>Hey Tony,
>
>I left on vacation right after we began this thread.  I apologize for the
>late reply.  As far as I can tell this thread never got resolved.  Ive had a
>bit of an issue with this in the past.  It seemed that every pass through
>the node set (I would send the value of the node to a javascript variable to
>store for later retrieval) I would get NaN as the value of the first node
>every time.  As long as I didn't try to use the variable in any type of
>concat or equation it wouldn't throw an error.  But as soon as I did it
>would puke.  I never got to the bottom of it and as such I abandoned my
>attempt to use javascript in this particular situation.  If this is the same
>issue you are seeing (first node evaluates to NaN, the rest of the nodes
>evaluate to there correct value) then I would simply set a 'var count = 0'
>and then loop through it each time you run through your function. If count =
>0 then set the var for the equation to a default value, otherwise use the
>node value.  If this works then at least you can test to see if your
>function works properly.  This is obviously not a long term solution but it
>will at least help you debug.
>
>Your other option would be to test the node for an empty string value with
><xsl:if> or <xsl:when> and send the function a default value when it
>evaluates to true.
>
>Ill continue to research the whole NaN issue with the first node in a set as
>this is something that has been troubling me in the back of my mind since I
>ran into a few months back.  If I come across something Ill let you know.
>
>Best regards,
>
>M.
>
>
>----- Original Message -----
>From: "Disalvo, Anthony J." <ANTHONY.J.DISALVO@xxxxxxxx>
>To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
>Sent: Thursday, October 16, 2003 8:37 AM
>Subject: RE: [xsl] Problem sending node Array to Javascript using .NET
>xsl/xml parse r
>
>
>> Joe,
>>
>> Here is a re-post of the original code for my problem.
>>
>> M., thanks for the ideas. unfortunately, I think that the value that is
>> being sent to the jscript is null and jscript does not seem to allow a
>> null
>> parameter to be sent in whether it was the
>> formatSigfigs(.,'AvgLabQARecovery') function or it is the  setNodeValue(.)
>> function.
>>
>> As a result it throws an error before it event tries to execute any of the
>> code within the jscript function.
>>
>> Anyone know of a way to set a default for a parameter in a jscript if the
>> parameter sent in is null.
>>
>> Thanks,
>>
>> Tony
>>
>> //////////////////////////////XML
>> INPUT///////////////////////////////////////////////////////////////////////
>> /
>>
>> <Report ReportID="QC-03" ReportTitle="Laboratory Report Sample - Percent
>> Recovery">
>> <Group GroupCategory="Sampling Event List" GroupValue="25,35,45,55,65,75">
>> <AnalyteData LabResultsTypeName="LCS" LabResultsTypeDescription="Result
>> from
>> a lab control sample" Analyte="Americium-241" AnalyticalMethodType="RGAMM"
>> AvgLabQARecovery="99.000000000000" MinLabQARecovery="99.000000000000"
>> MaxLabQARecovery="99.000000000000" AnalyteCount="2"/>
>> <AnalyteData LabResultsTypeName="LCS" LabResultsTypeDescription="Result
>> from
>> a lab control sample" Analyte="Cesium-137" AnalyticalMethodType="RGAMM"
>> AvgLabQARecovery="105.367005227874" MinLabQARecovery="97.000000000000"
>> MaxLabQARecovery="107.709999084473" AnalyteCount="531"/>
>> <GroupList GroupListValue="25" GroupListText="Cotto-Waxo
>> (DT14)-Verification-Class 2"/>
>> <GroupList GroupListValue="35" GroupListText="Plant 1 (Small Area #11
>> North)-Verification-Class 1"/>
>> </Group>
>> </Report>
>>
>> ////////////////////////////////////////////////////////////////////////////
> > /////////////////////////////////////////
>>
>> //////////////////////////////////////////XSL
>> INPUT//////////////////////////////////////////////////////////////
>>
>> <?xml version="1.0"?>
>> <xsl:stylesheet version="1.0"
>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>>  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
>>  xmlns:auto-nsl="http://www.w3.org/TR/WD-xsl";
>>  xmlns:local="urn:galileo-com:msxsl-jscript-utilities" >
>> <xsl:template match="/">
>> <xsl:for-each select="Report">
>> <table width="800px" border="1" cellpadding="0" cellspacing="0" >
>> <xsl:choose>
>> <xsl:when test="Group">
>> <tr><td>
>> <table border="1" width="100%" cellpadding="0" cellspacing="0">
>> <tr><td width="50%">Report Code</td><td
>> width="50%"><xsl:value-of select="@ReportID"/></td></tr>
>> <tr><td width="50%">Report Name</td><td
>> width="50%"><xsl:value-of select="@ReportTitle"/></td></tr>
>> </table>
>> <xsl:for-each select="Group">
>> <table>
>> <xsl:choose>
>> <xsl:when test="GroupList">
>> <tr>
>> <td><xsl:value-of
>> select="@GroupCategory"/></td>
>> <td></td>
>> </tr>
>> <xsl:for-each select="GroupList">
>> <tr>
>> <td></td>
>> <td><xsl:value-of
>> select="@GroupListText"/></td>
>> </tr>
>> </xsl:for-each>
>> </xsl:when>
>> <xsl:otherwise>
>> <tr>
>> <td><xsl:value-of
>> select="@GroupCategory"/></td>
>> <td><xsl:value-of
>> select="@GroupValue"/></td>
>> </tr>
>> </xsl:otherwise>
>> </xsl:choose>
>> </table>
>> <table cellpadding="0" cellspacing="0" class="rptHeadBold"
>> border="1" width="100%">
>> <tr>
>> <td align="right" width="17%">Analyte</td>
>> <td align="right" width="17%">Analytical
>> Method Type</td>
>> <td align="right" width="17%">Average Lab
>> Value</td>
>> <td align="right" width="17%">Min Lab
>> Value</td>
>> <td align="right" width="16%">Max Lab
>> Value</td>
>> <td align="right" width="16%">Analyte
>> Count</td>
>> </tr>
>> </table>
>> <table border="1" width="100%" cellpadding="0"
>> cellspacing="0" >
>> <xsl:for-each select="AnalyteData">
>> <tr>
>> <td align="right" width="17%"><xsl:value-of
>> select="@Analyte"/></td>
>> <td align="right" width="17%"><xsl:value-of
>> select="@AnalyticalMethodType"/></td>
> > <td align="right" width="17%"><xsl:value-of
>> select="local:formatSigfigs(.,'AvgLabQARecovery')"/></td>
>> <td align="right" width="17%"><xsl:value-of
>> select="local:formatSigfigs(.,'MinLabQARecovery')"/></td>
>> <td align="right" width="16%"><xsl:value-of
>> select="local:formatSigfigs(.,'MaxLabQARecovery')"/></td>
>> <td align="right" width="16%"><xsl:value-of
>> select="@AnalyteCount"/></td>
>> </tr>
>> </xsl:for-each>
>> </table>
>> </xsl:for-each>
>> </td></tr>
>> </xsl:when>
>> <xsl:otherwise>
>> <tr>
>> <td align="center">No data was returned for the selected
>> parameters.</td>
>> </tr>
>> </xsl:otherwise>
>> </xsl:choose>
>> </table>
>> </xsl:for-each>
>> </xsl:template>
>> <msxsl:script language="JavaScript" implements-prefix="local">
>> <![CDATA[
>> function formatSigfigs (oNodeList,ColumnName)
>> {
>> var oNode = oNodeList.item(0);
>>
>>
>> //var numberVal = oNode.getAttribute('AvgLabQARecovery');
>> var numberVal = oNode.getAttribute(ColumnName);
>> if ((numberVal >= 1000000)||(numberVal <= 0.0001))
>> {
>> var exponentVal;
>>
>> if (numberVal >= 1000000)
>> {
>> exponentVal = 5;
>> numberVal = numberVal/1000000
>> while(numberVal > 10)
>> {
>> numberVal = numberVal/10;
>> exponentVal = exponentVal + 1;
>> }
>> numberVal = formatNumber(numberVal,"0.00") + "E+" +
>> formatNumber(exponentVal,"0");
>> }
>> else
>> {
>> exponentVal = -4;
>> numberVal = numberVal* 10000;
>> while(numberVal < 1)
>> {
>> numberVal = numberVal*10;
>> exponentVal = exponentVal - 1;
>> }
>> numberVal = formatNumber(numberVal,"0.00") + "E" +
>> formatNumber(exponentVal,"0");
>> }
>>
>> }
>>
>> else if (numberVal >= 100000){numberVal =
>> (formatNumber(numberVal,"#,##0").substr(0,4) + "000");}
>> else if (numberVal >= 10000){numberVal =
>> (formatNumber(numberVal,"#,##0").substr(0,4) + "00");}
>> else if (numberVal >= 1000){numberVal =
>> (formatNumber(numberVal,"#,##0").substr(0,4) + "0");}
>> else if (numberVal >= 100){numberVal = formatNumber(numberVal,"#,##0");}
>> else if (numberVal >= 10){numberVal = formatNumber(numberVal,"#,##0.0");}
>> else if (numberVal >= 1){numberVal = formatNumber(numberVal,"#,##0.00");}
> > else if (numberVal >= 0.1){numberVal =
>> formatNumber(numberVal,"#,##0.000");}
>> else if (numberVal >= 0.01){numberVal =
>> formatNumber(numberVal,"#,##0.0000");}
>> else if (numberVal >= 0.001){numberVal =
>> formatNumber(numberVal,"#,##0.00000");}
>> return numberVal;
>> }
>>   var separator = ",";  // use comma as 000's separator
>>   var decpoint = ".";  // use period as decimal point
>>   var percent = "%";
>>   var currency = "$";  // use dollar sign for currency
>>
>>   function formatNumber(number, format, print) {  // use:
>> formatNumber(number, "format")
>>     if (print) document.write("formatNumber(" + number + ", \"" + format +
>> "\")<br>");
>>
>>     if (number - 0 != number) return null;  // if number is NaN return
>> null
>>     var useSeparator = format.indexOf(separator) != -1;  // use separators
>> in number
>>     var usePercent = format.indexOf(percent) != -1;  // convert output to
>> percentage
>>     var useCurrency = format.indexOf(currency) != -1;  // use currency
>> format
>>     var isNegative = (number < 0);
>>     number = Math.abs (number);
>>     if (usePercent) number *= 100;
>>     format = strip(format, separator + percent + currency);  // remove key
>> characters
>>     number = "" + number;  // convert number input to string
>>
>>      // split input value into LHS and RHS using decpoint as divider
>>     var dec = number.indexOf(decpoint) != -1;
>>     var nleftEnd = (dec) ? number.substring(0, number.indexOf(".")) :
>> number;
>>     var nrightEnd = (dec) ? number.substring(number.indexOf(".") + 1) :
>> "";
>>
>>      // split format string into LHS and RHS using decpoint as divider
>>     dec = format.indexOf(decpoint) != -1;
>>     var sleftEnd = (dec) ? format.substring(0, format.indexOf(".")) :
>> format;
>>     var srightEnd = (dec) ? format.substring(format.indexOf(".") + 1) :
>> "";
>>
>>      // adjust decimal places by cropping or adding zeros to LHS of number
>>     if (srightEnd.length < nrightEnd.length) {
>>       var nextChar = nrightEnd.charAt(srightEnd.length) - 0;
>>       nrightEnd = nrightEnd.substring(0, srightEnd.length);
> >       if (nextChar >= 5) nrightEnd = "" + ((nrightEnd - 0) + 1);  // round
>> up
>>
>>  // patch provided by Patti Marcoux 1999/08/06
>>       while (srightEnd.length > nrightEnd.length) {
>>         nrightEnd = "0" + nrightEnd;
>>       }
>>
>>       if (srightEnd.length < nrightEnd.length) {
>>         nrightEnd = nrightEnd.substring(1);
>>         nleftEnd = (nleftEnd - 0) + 1;
>>       }
>>     } else {
>>       for (var i=nrightEnd.length; srightEnd.length > nrightEnd.length;
>> i++)
>> {
>>         if (srightEnd.charAt(i) == "0") nrightEnd += "0";  // append zero
>> to
>> RHS of number
>>         else break;
>>       }
>>     }
>>
>>      // adjust leading zeros
>>     sleftEnd = strip(sleftEnd, "#");  // remove hashes from LHS of format
>>     while (sleftEnd.length > nleftEnd.length) {
>>       nleftEnd = "0" + nleftEnd;  // prepend zero to LHS of number
>>     }
>>
>>     if (useSeparator) nleftEnd = separate(nleftEnd, separator);  // add
>> separator
>>     var output = nleftEnd + ((nrightEnd != "") ? "." + nrightEnd : "");
>> //
>> combine parts
>>     output = ((useCurrency) ? currency : "") + output + ((usePercent) ?
>> percent : "");
>>     if (isNegative) {
>>       // patch suggested by Tom Denn 25/4/2001
>>       output = (useCurrency) ? "(" + output + ")" : "-" + output;
>>     }
>>     return output;
>>   }
>>
>>   function strip(input, chars) {  // strip all characters in 'chars' from
>> input
>>     var output = "";  // initialise output string
>>     for (var i=0; i < input.length; i++)
>>       if (chars.indexOf(input.charAt(i)) == -1)
>>         output += input.charAt(i);
>>     return output;
>>   }
>>
>>   function separate(input, separator) {  // format input using 'separator'
>> to mark 000's
>>     input = "" + input;
>>     var output = "";  // initialise output string
>>     for (var i=0; i < input.length; i++) {
>>       if (i != 0 && (input.length - i) % 3 == 0) output += separator;
>>       output += input.charAt(i);
>>     }
>>     return output;
>>   }
>>   ]]>
>>  </msxsl:script>
>> </xsl:stylesheet>
>>
>> -----Original Message-----
> > From: M. David Peterson [mailto:conners_dad@xxxxxxx]
>> Sent: Thursday, October 16, 2003 4:22 AM
>> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
>> Subject: RE: [xsl] Problem sending node Array to Javascript using .NET
>> xsl/xml parse r
>>
>>
>> It seems to me that one of three things are happening... One, the content
>> of
>>
>> the context node is empty an therefore returns an empty string (the
>> JScript
>> engine they are using doesnt like empty strings).  Two, there is a type
>> conversion issue that is not being addressed correctly in the transport to
>> the Javascript engine (ive seen this happen quite a bit, especially
>> running
>> on top of .NET using XslTransform() ). Three, somehow the call to the
>> javascript function is interupting the connection to the current node and
>> therefore sends null or an empty string or NaN or whatever.  There are a
>> few
>>
>> solutions I can think of, but the easiest to me would be this...
>>
>> Within your loop set a variable equal to the context node.
>>
>> <xsl:variable name="current" select="."/>
>>
>> Then just call the variable from within the call to the Javascript
>> function...
>>
>> <xsl:value-of select="local:formatSigfigs($current,'AvgLabQARecovery')"/>
>>
>>
>> You could also set a javascript global variable to the value of the
>> current
>> node and then use that within the formatSigfigs() function.
>>
>> Heres the Javascript...
>>
>>
>>         var nodeValue;
>>
>>         function setNodeValue(value){
>>             try{
>>                nodeValue = value;
>>                return 0;
>>             }
>>             catch{
>>                return 1;
>>             }
>>         }
>>
>>
>> And heres the XSLT...
>>
>> <xsl:choose>
>>    <xsl:when test="local:setNodeValue(.) = 0">
>>         <xsl:value-of select="local:formatSigfigs('AvgLabQARecovery')"/>
>> //Note: change the local:formatSigFigs() function to use the global var
>> 'nodeValue' to process and return the correct value
>>    </xsl:when>
>>    <xsl:otherwise>
>>         put something in here to tell you that the value didnt get set
>> correctly.
>>    </xsl:otherwise>
> > </xsl:choose>
>>
>> Using the above javascript variable solution would also allow you to call
>> a
>> returnValue function from an <xsl:value-of> element to determine what is
>> actually being sent to the javascript function...
>>
>> Something like:
>>
>> function returnNodeValue(){
>>
>>    return nodeValue;
>>
>> }
>>
>> and then call it with:
>>
>> <xsl:value-of select="local:returnNodeValue()"/>
>>
>> If you are getting the correct string written out then at least you know
>> youve got that part of the problem solved.
>>
>> I hope this helps!
>>
>> Best regards,
>>
>> M.
>>
>>
>>
>>
>>
>> >From: "Joe Fawcett" <joefawcett@xxxxxxxxxxx>
>> >Reply-To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
>> >To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
>> >Subject: RE: [xsl] Problem sending node Array to Javascript using .NET
>> >xsl/xml parse r
>> >Date: Thu, 16 Oct 2003 08:41:08 +0100
>> >
>> >I missed the first part of this, can you show a sample of the offending
>> >code?
>> >
>> >--
>> >
>> >Joe
>> >
>> >
>> >>From: "Disalvo, Anthony J." <ANTHONY.J.DISALVO@xxxxxxxx>
>> >>Reply-To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
>> >>To: "'xsl-list@xxxxxxxxxxxxxxxxxxxxxx'"
>> >><xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
>> >>Subject: RE: [xsl] Problem sending node Array to Javascript using .NET
>> >>xsl/xml parse r
>> >>Date: Wed, 15 Oct 2003 11:17:37 -0700
>> >>
>> >>Thanks for the Idea, I tried this and it did not work.
>> >>
>> >>
>> >>-----Original Message-----
>> >>From: Wendell Piez [mailto:wapiez@xxxxxxxxxxxxxxxx]
>> >>Sent: Tuesday, October 14, 2003 2:16 PM
>> >>To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
>> >>Subject: Re: [xsl] Problem sending node Array to Javascript using .NET
>> >>xsl/xml parse r
>> >>
>> >>
>> >>Anthony,
>> >>
>> >>At 12:25 PM 10/14/2003, you wrote:
>> >> >It is having a problem with the following line of code: <xsl:value-of
>> >> >select="local:formatSigfigs(.,'AvgLabQARecovery')"/>
>> >> >
>> >> >It does not like the period/decimal point being sent in to the
>> >>javascript
>> >>as
>> >> >a reference to the node.
>> >> >
>> >> >Any ideas on how to deal with this issue or alternatives on how tro
>> >> >reference the node not using the period / decimal point that will pass
> > >>the
>> >> >Microsoft parser's requirements?
>> >>
>> >>I have no idea whatsoever as to working with the MS toolkit, but you
>> >>might
>> >>try
>> >>
>> >>self::node()
>> >>
>> >>which is the XPath expression commonly abbreviated as "."
>> >>
>> >>Whether it works for you here is another question.
>> >>
>> >>Cheers,
>> >>Wendell
>> >>
>> >>
>> >>======================================================================
>> >>Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
>> >>Mulberry Technologies, Inc.                http://www.mulberrytech.com
>> >>17 West Jefferson Street                    Direct Phone: 301/315-9635
>> >>Suite 207                                          Phone: 301/315-9631
>> >>Rockville, MD  20850                                 Fax: 301/315-8285
>> >>----------------------------------------------------------------------
>> >>    Mulberry Technologies: A Consultancy Specializing in SGML and XML
>> >>======================================================================
>> >>
>> >>
>> >>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
>> >>
>> >>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
>> >>
>> >
>> >_________________________________________________________________
>> >Find a cheaper internet access deal - choose one to suit you.
>> >http://www.msn.co.uk/internetaccess
>> >
>> >
>> >XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
>> >
>>
>> _________________________________________________________________
>> Want to check if your PC is virus-infected?  Get a FREE computer virus
>> scan
>> online from McAfee.
>> http://clinic.mcafee.com/clinic/ibuy/campaign.asp?cid=3963
>>
>>
>>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
>>
>>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
>>
>>


--
======================================================================
B. Tommie Usdin                        mailto:btusdin@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.                http://www.mulberrytech.com   
17 West Jefferson Street                           Phone: 301/315-9631
Suite 207                                    Direct Line: 301/315-9634
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
  Mulberry Technologies: A Consultancy Specializing in  XML and SGML
======================================================================

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread