Issue Details (XML | Word | Printable)

Key: XALANJ-2223
Type: Bug Bug
Status: Open Open
Priority: Major Major
Assignee: Unassigned
Reporter: David M. Karr
Votes: 0
Watchers: 1
Operations

If you were logged in you would be able to see more operations.
XalanJ2

XSLT that calls "function-available" on parsed values fails with NPE

Created: 04/Nov/05 02:45 AM   Updated: 18/Mar/06 01:54 AM
Return to search
Component/s: Xalan
Affects Version/s: 2.4
Fix Version/s: None

Time Tracking:
Not Specified

Environment: Windows XP; JDK 1.4.2_05;


 Description  « Hide
I wrote a stylesheet whose only purpose is to call "function-available" on the EXSLT functions specified in an XML file. I first tested this in Stylus Studio, using the Xalan 2.5.2 engine. When I run it, I get:

functionAvailable.xsl (19, 48): java.lang.RuntimeException: Unknown error in XPath.

I then built a standalone test case, using raw JDK 1.4.2 (which uses Xalan 2.4.1), and I got a similar error, with the stack trace that follows this. I also include inline the stylesheet, and a sample of the data. Although I only tested this with 2.4.1 and 2.5.2, Henry Zongaro said that he tested my stylesheet on all releases of Xalan-J from 2.4.0 through to 2.7.0, and got the same error.

I extracted the code for the function that reports the exception, which is the following:

------------
  public boolean functionAvailable(String ns, String funcName)
          throws javax.xml.transform.TransformerException
  {
    return getExtensionsTable().functionAvailable(ns, funcName); // 448
  }
------------

The "getExtensionTable()" method is just an accessor. This means that the "m_extensionsTable" is null, which is only set in the "setExtensionsTable()" method, which is only called from the "transformNode()" function. It seems plausible to guess that "transformNode()" is never called (or perhaps "sroot.getExtensions()" is null). Is there something about my stylesheet that is making it not call "transformNode()" before it gets to "functionAvailable()"?

Stack trace:
---------------------------
; SystemID: file:///C:/cygwin/home/u166705/work/mfxslt/etc/functionAvailable.xsl; Line#: 20; Column#: 47
javax.xml.transform.TransformerException: Unknown error in XPath.
at org.apache.xpath.XPath.bool(XPath.java:412)
at org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:170)
at org.apache.xalan.templates.ElemApplyTemplates.transformSelectedNodes(ElemApplyTemplates.java:425)
at org.apache.xalan.templates.ElemApplyTemplates.execute(ElemApplyTemplates.java:216)
at org.apache.xalan.templates.ElemApplyTemplates.transformSelectedNodes(ElemApplyTemplates.java:425)
at org.apache.xalan.templates.ElemApplyTemplates.execute(ElemApplyTemplates.java:216)
at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2339)
at org.apache.xalan.transformer.TransformerImpl.applyTemplateToNode(TransformerImpl.java:2160)
at org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1213)
at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:668)
at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1129)
at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1107)
at com.wamu.mfxslt.XSLTTool.transform(XSLTTool.java:105)
at com.wamu.mfxslt.XSLTTool.transform(XSLTTool.java:97)
at com.wamu.mfxslt.XSLTTool.main(XSLTTool.java:58)
Caused by: java.lang.NullPointerException
at org.apache.xalan.transformer.TransformerImpl.functionAvailable(TransformerImpl.java:448)
at org.apache.xpath.functions.FuncExtFunctionAvailable.execute(FuncExtFunctionAvailable.java:130)
at org.apache.xpath.Expression.bool(Expression.java:230)
at org.apache.xpath.XPath.bool(XPath.java:383)
... 14 more
---------
java.lang.NullPointerException
at org.apache.xalan.transformer.TransformerImpl.functionAvailable(TransformerImpl.java:448)
at org.apache.xpath.functions.FuncExtFunctionAvailable.execute(FuncExtFunctionAvailable.java:130)
at org.apache.xpath.Expression.bool(Expression.java:230)
at org.apache.xpath.XPath.bool(XPath.java:383)
at org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:170)
at org.apache.xalan.templates.ElemApplyTemplates.transformSelectedNodes(ElemApplyTemplates.java:425)
at org.apache.xalan.templates.ElemApplyTemplates.execute(ElemApplyTemplates.java:216)
at org.apache.xalan.templates.ElemApplyTemplates.transformSelectedNodes(ElemApplyTemplates.java:425)
at org.apache.xalan.templates.ElemApplyTemplates.execute(ElemApplyTemplates.java:216)
at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2339)
at org.apache.xalan.transformer.TransformerImpl.applyTemplateToNode(TransformerImpl.java:2160)
at org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1213)
at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:668)
at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1129)
at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1107)
at com.wamu.mfxslt.XSLTTool.transform(XSLTTool.java:105)
at com.wamu.mfxslt.XSLTTool.transform(XSLTTool.java:97)
at com.wamu.mfxslt.XSLTTool.main(XSLTTool.java:58)
---------------------------

The stylesheet is just:
---------------
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"

xmlns:date="http://exslt.org/dates-and-times"
xmlns:dyn="http://exslt.org/dynamic"
xmlns:func="http://exslt.org/functions"
xmlns:math="http://exslt.org/math"
xmlns:random="http://exslt.org/random"

xmlns:regexp="http://exslt.org/regular-expressions"
xmlns:set="http://exslt.org/sets"
xmlns:str="http://exslt.org/strings"
extension-element-prefixes="exsl str
date dyn func math random regexp set str"
exclude-result-prefixes="exsl str date
dyn func math random regexp set str"
>
<xsl:output method="xml"/>

<xsl:template match="function">
<xsl:choose>
<xsl:when test="function-available(text())">
<xsl:value-of select="text()"/> present
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="text()"/> not present
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
---------------

The data looks like:
---------------
<?xml version="1.0"?>
<functions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="file:///c:/cygwin/home/u166705/work/mfxsl
t/etc/Functions.xsd">
<function>date:add</function> <function>date:add-duration</function>
<function>date:date</function>
[deleted]
</functions>
---------------


 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
David M. Karr added a comment - 04/Nov/05 03:36 AM
I tried some other experiments with this. If I call "function-available" with a value whose namespace (or without a namespace) is not registered in the stylesheet, then it does not fail. For instance, the value "sum" does not fail. The value "exslt:date-add" does not fail, if I change the namespace prefix for exslt-common from "exslt" to "xxslt" (for example).

Andrea Mattioli added a comment - 18/Mar/06 01:54 AM
I think this problem could be related with the fact that XALAN returns "true" testing "function-available('exsl:nodeSet')" and "false" testing "function-available('exsl:node-set)" and the same for "function-available('date:date-time')"and "function-available('date:dateTime')" and so on.
By
http://www.exslt.org/exsl/functions/node-set/
I think should be better return true testing "exsl:node-set" and "date:date-time()"