Altova Mailing List Archives>Archive Index >comp.text.xml Archive Home >Recent entries >Thread Prev - Re: Do I have a bug, or am I pushing the limits of XSLT engines? >Thread Next - Re: Do I have a bug, or am I pushing the limits of XSLT engines? Re: Do I have a bug, or am I pushing the limits of XSLT engines?To: NULL Date: 5/4/2004 8:31:00 AM aggedor@e... (A. Bolmarcich) wrote in message news:<slrnc9di56.e5e.aggedor@e...>... > In article <faf20be8.0405031406.750d62e4@p...>, Mike Whittemore wrote: > > I am trying to convert an HTML table into a list of name-value pairs, > > one pair per field in the table. I believe my XSLT is correct, but > > I've tried both Xalan and Saxon, which both fail with different > > results. Below I've listed my HTML input, my expected XML output, my > > XSLT, and the actual output from both Saxon and Xalan. Thanks in > > advance. > > [snipped most of helpful example] > > > <xsl:transform version="1.0" > > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > > > > <xsl:variable name="fields" select="//th" /> > > > > <xsl:template name="lookup-field"> > > <xsl:param name="at-index"/> > > <xsl:value-of select="$fields[$at-index]" /> > > </xsl:template> > > > > <xsl:template match="/html/body/table"> > > <records> > > <xsl:apply-templates select="tr[td]"/> > > </records> > > </xsl:template> > > > > <xsl:template match="tr[td]"> > > <record> > > <xsl:for-each select="td"> > > <field> > > <name> > > <xsl:call-template name="lookup-field"> > > <xsl:with-param name="at-index"> > > <xsl:value-of select="position()"/> > > </xsl:with-param> > > Replace the above three lines with > > <xsl:with-param name="at-index" select="position()"/> > > What you have sets the param to a result tree fragment. You need to set the param > to a number, so that in the called template $at-index evaluates to a number. > > > </xsl:call-template> > > </name> > > <value> > > <xsl:value-of select="."/> > > </value> > > </field> > > </xsl:for-each> > > </record> > > </xsl:template> > > > > </xsl:transform> Thanks for your response. That worked perfectly for the Saxon and Microsoft engines, but I still get a null pointer exception from the Xalan engine. I suppose this show's it is a good idea to test your XSL transformations on multiple engines if you want them to increase the chances of them being portable. Below I've posted a different solution that works for all 3 engines mentioned. I'm still new at this, so if you spot a more elegant solution I'd appreciate seeing it. Thanks again. "Portable" XSLT Solution: ------------------------- <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/html/body/table"> <records> <xsl:apply-templates select="tr[td]"/> </records> </xsl:template> <xsl:template match="tr[td]"> <record> <xsl:for-each select="td"> <field> <name> <xsl:variable name="pos" select="position()" /> <xsl:value-of select="/descendant::th[$pos]"/> </name> <value> <xsl:value-of select="."/> </value> </field> </xsl:for-each> </record> </xsl:template> </xsl:transform> PS. I'm not sure why I need to assign position() to a variable first, but without doing it this way it was always equating to "1". | ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
