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(_at_)msn(_dot_)com]
Sent: Thursday, October 16, 2003 4:22 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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(_at_)hotmail(_dot_)com>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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(_dot_)J(_dot_)DISALVO(_at_)saic(_dot_)com>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: "'xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com'"
<xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
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(_at_)mulberrytech(_dot_)com]
Sent: Tuesday, October 14, 2003 2:16 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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(_at_)mulberrytech(_dot_)com
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