M
Mike Whittemore
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.
HTML Input
----------
<html>
<head/>
<body>
<table>
<tr>
<th>Field 1</th>
<th>Field 2</th>
</tr>
<tr>
<td>A</td>
<td>1</td>
</tr>
<tr>
<td>B</td>
<td>2</td>
</tr>
</table>
</body>
</html>
Expected XML Output
-------------------
<?xml version="1.0" encoding="UTF-8" ?>
<records>
<record>
<field>
<name>Field 1</name>
<value>A</value>
</field>
<field>
<name>Field 2</name>
<value>1</value>
</field>
</record>
<record>
<field>
<name>Field 1</name>
<value>B</value>
</field>
<field>
<name>Field 2</name>
<value>2</value>
</field>
</record>
</records>
XSLT
----
<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">
<xslaram 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>
</xsl:call-template>
</name>
<value>
<xsl:value-of select="."/>
</value>
</field>
</xsl:for-each>
</record>
</xsl:template>
</xsl:transform>
Actual Output From Saxon:
-------------------------
<?xml version="1.0" encoding="UTF-8" ?>
<records>
<record>
<field>
<name>Field 1</name>
<value>A</value>
</field>
<field>
<name>Field 1</name>
<value>1</value>
</field>
</record>
<record>
<field>
<name>Field 1</name>
<value>B</value>
</field>
<field>
<name>Field 1</name>
<value>2</value>
</field>
</record>
</records>
Actual Output From Xalan:
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.
HTML Input
----------
<html>
<head/>
<body>
<table>
<tr>
<th>Field 1</th>
<th>Field 2</th>
</tr>
<tr>
<td>A</td>
<td>1</td>
</tr>
<tr>
<td>B</td>
<td>2</td>
</tr>
</table>
</body>
</html>
Expected XML Output
-------------------
<?xml version="1.0" encoding="UTF-8" ?>
<records>
<record>
<field>
<name>Field 1</name>
<value>A</value>
</field>
<field>
<name>Field 2</name>
<value>1</value>
</field>
</record>
<record>
<field>
<name>Field 1</name>
<value>B</value>
</field>
<field>
<name>Field 2</name>
<value>2</value>
</field>
</record>
</records>
XSLT
----
<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">
<xslaram 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>
</xsl:call-template>
</name>
<value>
<xsl:value-of select="."/>
</value>
</field>
</xsl:for-each>
</record>
</xsl:template>
</xsl:transform>
Actual Output From Saxon:
-------------------------
<?xml version="1.0" encoding="UTF-8" ?>
<records>
<record>
<field>
<name>Field 1</name>
<value>A</value>
</field>
<field>
<name>Field 1</name>
<value>1</value>
</field>
</record>
<record>
<field>
<name>Field 1</name>
<value>B</value>
</field>
<field>
<name>Field 1</name>
<value>2</value>
</field>
</record>
</records>
Actual Output From Xalan: