Solved

Error in XPath 2.0 expression

Posted on 2013-05-22
4
542 Views
Last Modified: 2013-05-23
I switched my XSL from XSLT 1.0 to 2.0 because I wanted to be able to access some of the functions in 2.0, and now I'm getting the following error message:

Error in XPath 2.0 expression, Cast failed, invalid lexical value - xs:double ''

My XSL looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
	<xsl:variable name="SQM_Petroleum_Refining_CH4_Emission_Quantity">
		<xsl:choose>
			<xsl:when test="/Report/Report_Detail/Sources/SQM/Petroleum_Refining/Emissions/Emission[Gas = 'CH4' ]/Emission_Quantity  != '' ">
				<xsl:value-of select="number(sum(/Report/Report_Detail/Sources/SQM/Petroleum_Refining/Emissions/Emission[Gas = 'CH4' ]/Emission_Quantity))"/>
			</xsl:when>
			<xsl:otherwise><xsl:value-of select="number(0)"/></xsl:otherwise>
		</xsl:choose>
	</xsl:variable>
	<xsl:template match="/">
	<xsl:value-of select="$SQM_Petroleum_Refining_CH4_Emission_Quantity"/>
	</xsl:template>
</xsl:stylesheet>

Open in new window


My XML looks like this:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="Test.xsl"?>
<Report>
	<Report_Detail>
		<Sources>
			<SQM>
				<Petroleum_Refining>
					<SectionTitle>(a) catalyst regeneration</SectionTitle>
					<Emissions>
						<Emission>
							<Gas>CH4</Gas>
							<Not_Applicable_Indicator>0</Not_Applicable_Indicator>
							<Methodology>ON.203(a)(2)</Methodology>
							<Emission_Quantity>0.0006</Emission_Quantity>
							<Emission_Calculated_Quantity>0.0126</Emission_Calculated_Quantity>
						</Emission>
					</Emissions>
					<SectionTitle>(b) process vents</SectionTitle>
					<Emissions>
						<Emission>
							<Gas>CH4</Gas>
							<Not_Applicable_Indicator>1</Not_Applicable_Indicator>
							<Methodology/>
							<Emission_Quantity/>
							<Emission_Calculated_Quantity>0.0000</Emission_Calculated_Quantity>
						</Emission>
					</Emissions>
					<SectionTitle>(e) flares and other control devices</SectionTitle>
					<Emissions>
						<Emission>
							<Gas>CH4</Gas>
							<Not_Applicable_Indicator>0</Not_Applicable_Indicator>
							<Methodology>ON.203(e)</Methodology>
							<Emission_Quantity>5.1580</Emission_Quantity>
							<Emission_Calculated_Quantity>108.3180</Emission_Calculated_Quantity>
						</Emission>
					</Emissions>
				</Petroleum_Refining>
			</SQM>
		</Sources>
	</Report_Detail>
</Report>

Open in new window

0
Comment
Question by:mariita
  • 3
4 Comments
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 39189418
XSLT2 is type sensitive.

You need to cast to number and filter out the empty ones

            <xsl:when test="/Report/Report_Detail/Sources/SQM/Petroleum_Refining/Emissions/Emission[Gas = 'CH4' ]/Emission_Quantity[normalize-space()]">
                <xsl:value-of select="sum(/Report/Report_Detail/Sources/SQM/Petroleum_Refining/Emissions/Emission[Gas = 'CH4' ]/Emission_Quantity[normalize-space()]/number())"/>
            </xsl:when>
0
 
LVL 60

Accepted Solution

by:
Geert Bormans earned 500 total points
ID: 39189421
but you don't need the choose construct,
the sum of no nodes is 0
so take the ones that are castable as xs:double directly

    <xsl:variable name="SQM_Petroleum_Refining_CH4_Emission_Quantity"
        select="sum(/Report/Report_Detail/Sources/SQM/Petroleum_Refining/Emissions/Emission[Gas = 'CH4' ]/Emission_Quantity[. castable as xs:double])"/>
0
 

Author Closing Comment

by:mariita
ID: 39190287
Thanks again.
0
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 39190484
welcome
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

I was working on a PowerPoint add-in the other day and a client asked me "can you implement a feature which processes a chart when it's pasted into a slide from another deck?". It got me wondering how to hook into built-in ribbon events in Office.
Many times as a report developer I've been asked to display normalized data such as three rows with values Jack, Joe, and Bob as a single comma-separated string such as 'Jack, Joe, Bob', and vice versa.  Here's how to do it. 
Internet Business Fax to Email Made Easy - With  eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, f…
Both in life and business – not all partnerships are created equal. As the demand for cloud services increases, so do the number of self-proclaimed cloud partners. Asking the right questions up front in the partnership, will enable both parties …

911 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now