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)
