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?To: NULL Date: 5/4/2004 3:05:00 PM michael.whittemore@b... (Mike Whittemore) wrote in message news:<faf20be8.0405040730.359527a5@p...>... > 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". My last post on this. I switched from using the version of Xalan (2.2) that shipped with my JVM, to the latest 2.6. After reading the Xalan FAQ to figure out how to override the default version of Xalan, I ran my test and it succeeded. Thanks again for the help. | ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
