Altova Mailing List Archives>Archive Index >microsoft.public.xsl Archive Home >Recent entries >Thread Prev - Converting html table to xml [Thread Next] Re: Converting html table to xmlTo: NULL Date: 5/3/2007 4:02:00 PM
craigg75@g... wrote:
> If I have an html table such as:
>
> <table>
> <tr class="parent">
> <td>pdata</td>
> </tr>
> <tr class="child">
> <td>cdataa</td>
> </tr>
> <tr class="child">
> <td>cdatab</td>
> </tr>
> <tr class="child">
> <td>cdatac</td>
> </tr>
> <tr class="parent">
> <td>pdatab</td>
> </tr>
> <tr class="child">
> <td>cdatae</td>
> </tr>
> </table>
>
> I'd like to get it to be
>
> <root>
> <parent>pdata
> <child>cdataa</child>
> <child>cdatab</child>
> <child>cdatac</child>
> </parent>
> <parent>pdatab
> <child>cdatae</child>
> </parent>
> </root>
Use a key to group the elements e.g.
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="parent-tr" match="tr[@class = 'child']"
use="generate-id(preceding-sibling::tr[@class = 'parent'][1])"/>
<xsl:template match="table">
<root>
<xsl:apply-templates select="tr[@class = 'parent']" mode="group"/>
</root>
</xsl:template>
<xsl:template match="tr" mode="group">
<parent>
<data><xsl:value-of select="td"/></data>
<xsl:apply-templates select="key('parent-tr', generate-id(.))"/>
</parent>
</xsl:template>
<xsl:template match="tr">
<child><xsl:value-of select="td"/></child>
</xsl:template>
</xsl:stylesheet>
In that solution I have wrapped the parent text content into a data
element to avoid mixed contents, if you insist on mixed contents then
take out the <data> above, the grouping solution with the key remains
unchanged.
--
Martin Honnen --- MVP XML
http://JavaScript.FAQTs.com/
| ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
