xsl-list
[Top] [All Lists]

(unknown)

2003-10-22 13:44:41
      /xml parse r
Date: Wed, 22 Oct 2003 09:37:54 -0700
MIME-Version: 1.0
X-Mailer: Internet Mail Service (5.5.2657.72)
Content-Type: text/plain;
      charset="ISO-8859-1"

Thanks for the ideas on this issue.

I ended up developing a SQL script to format the data as I wanted and
eliminated the javascript altogether from this process.

It was alot of pretty nasty code, but it got me where I wanted since I
couldn't get this thing to work.

Thanks,

Tony

-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com]On Behalf Of 
Mulberry
Technologies List Owner
Sent: Tuesday, October 21, 2003 4:18 PM
To: xsl-list
Subject: Re: [xsl] Problem sending node Array to Javascript using .NET
xsl/xml parse r


From: "M. David Peterson" <conners_dad(_at_)msn(_dot_)com>
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
References:
<1303AA14B8B7844FBE1F1810ECCD8098DC2E44(_at_)us-st-ann(_dot_)mail(_dot_)saic(_dot_)com>
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(_dot_)J(_dot_)DISALVO(_at_)saic(_dot_)com>
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
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(_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




--
======================================================================
B. Tommie Usdin                        
mailto:btusdin(_at_)mulberrytech(_dot_)com
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
Sender: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Precedence: bulk
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
X-MailLoop: 1



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



<Prev in Thread] Current Thread [Next in Thread>