Solved

Error in XPath 2.0 expression

Posted on 2013-05-22
4
551 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

MIM Survival Guide for Service Desk Managers

Major incidents can send mastered service desk processes into disorder. Systems and tools produce the data needed to resolve these incidents, but your challenge is getting that information to the right people fast. Check out the Survival Guide and begin bringing order to chaos.

Question has a verified solution.

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

The Problem How to write an Xquery that works like a SQL outer join, providing placeholders for absent data on the outer side?  I give a bit more background at the end. The situation expressed as relational data Let’s work through this.  I’ve …
Browsing the questions asked to the Experts of this forum, you will be amazed to see how many times people are headaching about monster regular expressions (regex) to select that specific part of some HTML or XML file they want to extract. The examp…
Email security requires an ever evolving service that stays up to date with counter-evolving threats. The Email Laundry perform Research and Development to ensure their email security service evolves faster than cyber criminals. We apply our Threat…
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

831 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