DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=18385>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=18385

Problem with func:function in Xalan

           Summary: Problem with func:function in Xalan
           Product: XalanJ2
           Version: CurrentCVS
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: Minor
          Priority: Other
         Component: org.apache.xalan.lib
        AssignedTo: [EMAIL PROTECTED]
        ReportedBy: [EMAIL PROTECTED]


Stylesheet:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0"
 xmlns:func="http://exslt.org/functions";
 xmlns:foxy="http://foxyshadis.dyndns.org";
 exclude-result-prefixes="xalan str foxy dt func redirect exslt"
>

<xsl:param name="view_user" select="''"/>
<xsl:param name="view_pass" select="''"/>

<xsl:variable name="journal"
select="document('test-problem-1.xml')/journal"/>
<xsl:variable name="journal_info" select="$journal/entrant"/>
<xsl:variable name="journal_entry"
select="document('test-problem-2.xml')//entry"/>
<xsl:variable name="journal_friends" select="$journal/friends/fr"/>

<xsl:template match="/">
<html>
<body>
<p>1. <xsl:apply-templates select="$journal_entry" mode="grab"/></p>
<p>2. <xsl:apply-templates select="$journal_entry" mode="var"/></p>
<p>3. <xsl:apply-templates select="$journal_entry[
foxy:entry-security-1(@security)='public']" mode="grab"/></p>
<p>4. <xsl:apply-templates select="$journal_entry[
foxy:entry-security-2(@security)=2]" mode="var"/></p>
<p>5. <xsl:apply-templates select="$journal_entry[
foxy:entry-security-2(@security)=0]" mode="var"/></p>
</body>
</html>
</xsl:template>

<xsl:template match="entry" mode="grab">
<xsl:variable name="sec" select="@security"/>- <xsl:value-of
select="foxy:entry-security-1(@security)"/>
</xsl:template>

<xsl:template match="entry" mode="var">
<xsl:variable name="sec" select="@security"/>- <xsl:value-of
select="foxy:entry-security-1($sec)"/>
</xsl:template>

<func:function name="foxy:entry-security-1">
<xsl:param name="level" select="'private'"/>
<xsl:variable name="allowed">
<xsl:if test="$level='friends' and
[EMAIL PROTECTED] and @pass=$view_pass]">3</xsl:if>
<xsl:if test="[EMAIL PROTECTED] and
@pass=$view_pass]/@level[1]=$level">4</xsl:if>0</xsl:variable>
<func:result select="$level"/>
</func:function>

<func:function name="foxy:entry-security-2">
<xsl:param name="level" select="'private'"/>
<func:result select="position()"/>
</func:function>


</xsl:stylesheet>

Input XML-1:
<?xml version="1.0" encoding="UTF-8"?>
<journal>
<entrant username="foxyshadis" pass="fx"/>
<friends>
 <fr name="friend" pass="no" level=""/>
 <fr name="john.smith" pass="sphinx" level=""/>
</friends>
</journal>

Input XML-2:
<?xml version="1.0" encoding="UTF-8"?>
<entries>
<entry security="public"/>
<entry security="private"/>
<entry security="employee"/>
<entry security="private"/>
<entry security="john.smith"/>
<entry security="public"/>
</entries>

Xalan command line:
java org.apache.xalan.xslt.Process -xsl c:/fox/text/foxy/journal/test-problem-2.xsl

Output:
<html>
<body>
<p>1. - - - - - - </p>
<p>2. - public- private- employee- private- john.smith- public</p>
<p>3. </p>
<p>4. </p>
<p>5. - public</p>
</body>
</html>

Expected Output:
<body>
<p>1. - public- private- employee- private- john.smith- public</p>
<p>2. - public- private- employee- private- john.smith- public</p>
<p>3. - public- public</p>
<p>4. ???</p>
<p>5. ???</p>
</body>
</html>


Problem 1: #1 does not show when given an xpath
[foxy:entry-security-1(@security)], yet #2 shows when given a variable slaved to
the same xpath [foxy:entry-security-1($sec)]. That's the only difference between
#1 and and #2. This appears to have to do with the if statements inside the
variable $allowed; remove those and expected output is seen. May have to do with
the 'and'? Other observations: Take out the first if, and it dies wtih NPE. See [1].

Problem 2: Attempting validation in the xpath of #3's apply-templates fails.
Possible cause, same as #1; it exhibits the same pattern of working when the if
statements are both removed.
<xsl:apply-templates select="$journal_entry[
foxy:entry-security-1(@security)='public']" mode="grab"/></p>

Problem 3: position() undefined when used as in #4 and #5, used within a
function called in a predicate. Sometimes it's always zero, sometimes I just
have no idea what it is, since I can't glean the information out of XSLT. The
EXSLT spec has no words on this. Hmm. Looking at the XSLT 2.0 draft, I see this:

[ERR065] Within the body of a stylesheet function, the focus is initially
undefined; this means that any attempt to reference the context item, context
position, or context size is a dynamic error.

So any call to position() or context item should be flagged and killed.


[1] Output of NPE:
<html>
<body>
<p>1. - </p>
</body>

; SystemID: file:///c:/fox/text/foxy/journal/test-problem-2.xsl; Line#: 35;
Column#: 44
javax.xml.transform.TransformerException: java.lang.NullPointerException
        at org.apache.xalan.templates.ElemValueOf.execute(ElemValueOf.java:330)
        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:2336)
        at
org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:696)
        at
org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2336)
        at
org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:696)
        at
org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2336)
        at
org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:696)
        at
org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2336)
        at
org.apache.xalan.transformer.TransformerImpl.applyTemplateToNode(TransformerImpl.java:2157)
        at
org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1210)
        at
org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:665)
        at
org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1126)
        at
org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1104)
        at org.apache.xalan.xslt.Process.main(Process.java:1036)
Caused by: java.lang.NullPointerException
        at
org.apache.xpath.axes.BasicTestIterator.nextNode(BasicTestIterator.java:186)
        at org.apache.xpath.axes.NodeSequence.nextNode(NodeSequence.java:318)
        at org.apache.xpath.axes.NodeSequence.item(NodeSequence.java:508)
        at
org.apache.xpath.objects.XNodeSet.dispatchCharactersEvents(XNodeSet.java:269)
        at
org.apache.xpath.Expression.executeCharsToContentHandler(Expression.java:351)
        at org.apache.xalan.templates.ElemValueOf.execute(ElemValueOf.java:311)
        ... 15 more
---------
java.lang.NullPointerException
        at
org.apache.xpath.axes.BasicTestIterator.nextNode(BasicTestIterator.java:186)
        at org.apache.xpath.axes.NodeSequence.nextNode(NodeSequence.java:318)
        at org.apache.xpath.axes.NodeSequence.item(NodeSequence.java:508)
        at
org.apache.xpath.objects.XNodeSet.dispatchCharactersEvents(XNodeSet.java:269)
        at
org.apache.xpath.Expression.executeCharsToContentHandler(Expression.java:351)
        at org.apache.xalan.templates.ElemValueOf.execute(ElemValueOf.java:311)
        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:2336)
        at
org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:696)
        at
org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2336)
        at
org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:696)
        at
org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2336)
        at
org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:696)
        at
org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2336)
        at
org.apache.xalan.transformer.TransformerImpl.applyTemplateToNode(TransformerImpl.java:2157)
        at
org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1210)
        at
org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:665)
        at
org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1126)
        at
org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1104)
        at org.apache.xalan.xslt.Process.main(Process.java:1036)

Reply via email to