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=14406>. 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=14406 Calling to nodelist() in TraceListener changed transformation output Summary: Calling to nodelist() in TraceListener changed transformation output Product: XalanJ2 Version: 2.4 Platform: All OS/Version: All Status: NEW Severity: Critical Priority: Other Component: org.apache.xpath AssignedTo: [EMAIL PROTECTED] ReportedBy: [EMAIL PROTECTED] Here is a simple test program. import javax.xml.transform.*; import javax.xml.transform.stream.*; import org.apache.xalan.trace.*; import org.w3c.dom.*; public class tracetest { public tracetest(String xml, String xslt) { TransformerFactory tFactory = TransformerFactory.newInstance(); try { Transformer transformer = tFactory.newTransformer(new StreamSource (xslt)); ((org.apache.xalan.transformer.TransformerImpl) transformer).getTraceManager().addTraceListener(new TestTraceListener()); transformer.transform(new StreamSource(xml), new StreamResult (System.out)); } catch (Exception ex) { ex.printStackTrace(); } } public static void main(String[] args) { if (args.length != 2) { System.out.println("java tracetest xml-file xslt-file"); System.exit(1); } new tracetest(args[0], args[1]); } } class TestTraceListener implements TraceListener { public void trace(TracerEvent ev) { } public void selected(SelectionEvent ev) throws javax.xml.transform.TransformerException { NodeList nl = ev.m_selection.nodelist(); } public void generated(GenerateEvent ev) { } } With or without the line NodeList nl = ev.m_selection.nodelist(); will change Xalan's behaviour dramatically. Xalan 2.4.1: With calling to nodelist(), for-each select nothing, without that calling, evereything works fine. Xalan 2.2.x: With calling to nodelist(), for-each select twice of each node, without that calling, evereything works fine. The method nodelist() should be READ-ONLY, should not change any state in the transformaer. Here is the test XML file: <?xml version="1.0"?> <!DOCTYPE XmlEmployees SYSTEM "Employees.dtd"> <XmlEmployees> <XmlEmployee> <EmpNo>2</EmpNo> <FirstName>Robert</FirstName> <LastName>Nelson</LastName> <PhoneExt>250</PhoneExt> <HireDate>1988-12-28</HireDate> <DeptNo>600</DeptNo> <JobCode>VP</JobCode> <JobGrade>2</JobGrade> <JobCountry>USA</JobCountry> <Salary>105900.000000</Salary> <FullName>Nelson, Robert</FullName> </XmlEmployee> <XmlEmployee> <EmpNo>4</EmpNo> <FirstName>Bruce</FirstName> <LastName>Young</LastName> <PhoneExt>233</PhoneExt> <HireDate>1988-12-28</HireDate> <DeptNo>621</DeptNo> <JobCode>Eng</JobCode> <JobGrade>2</JobGrade> <JobCountry>USA</JobCountry> <Salary>97500.000000</Salary> <FullName>Young, Bruce</FullName> </XmlEmployee> <XmlEmployee> <EmpNo>5</EmpNo> <FirstName>Kim</FirstName> <LastName>Lambert</LastName> <PhoneExt>22</PhoneExt> <HireDate>1989-02-06</HireDate> <DeptNo>130</DeptNo> <JobCode>Eng</JobCode> <JobGrade>2</JobGrade> <JobCountry>USA</JobCountry> <Salary>102750.000000</Salary> <FullName>Lambert, Kim</FullName> </XmlEmployee> </XmlEmployees> Here is the XSLT file. <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java"> <xsl:output method="xml" indent="yes"/> <xsl:output encoding="ISO-8859-1"/> <xsl:strip-space elements="*"/> <xsl:template match="/"> <html> <head> <xsl:element name="title">EmployeesList View</xsl:element> <a> <img alt="" border="0" height="64" src="images/jbuilder.gif" width="64"/> </a> </head> <body> <xsl:element name="h1">List of Employees</xsl:element> <xsl:element name = "table"> <xsl:attribute name="border">2</xsl:attribute> <xsl:attribute name="bgColor">#FF8040</xsl:attribute> <xsl:attribute name="cellPadding">3</xsl:attribute> <xsl:attribute name="cellSpacing">3</xsl:attribute> <xsl:attribute name="frame">box</xsl:attribute> <xsl:attribute name="bordercolor">black</xsl:attribute> <xsl:attribute name="rules">all</xsl:attribute> <tr BGCOLOR = "Yellow"> <th>Name</th><th>Emp_No</th><th>Dept_No</th><th>Extension</th><th>Hire_Date</th ><th>Salary($)</th> <th>Code</th><th>Grade</th><th>Country</th> </tr> <xsl:for-each select="XmlEmployees/XmlEmployee"> <xsl:sort select="EmpNo"/> <tr> <xsl:element name="td"> <xsl:value-of select="FullName"/> </xsl:element> <xsl:element name="td"> <xsl:value-of select="EmpNo"/> </xsl:element> <xsl:element name="td"> <xsl:value-of select="DeptNo"/> </xsl:element> <xsl:element name="td"> <xsl:value-of select="PhoneExt"/> </xsl:element> <xsl:element name="td"> <xsl:value-of select="HireDate"/> </xsl:element> <xsl:element name="td"> <xsl:value-of select="Salary"/> </xsl:element> <xsl:element name="td"> <xsl:value-of select="JobCode"/> </xsl:element> <xsl:element name="td"> <xsl:value-of select="JobGrade"/> </xsl:element> <xsl:element name="td"> <xsl:value-of select="JobCountry"/> </xsl:element> </tr> </xsl:for-each> </xsl:element> </body> </html> </xsl:template> </xsl:stylesheet>
