How to recursively delete some xml elements using XSLT
Posted
by Monomachus
on Stack Overflow
See other posts from Stack Overflow
or by Monomachus
Published on 2010-04-14T15:04:01Z
Indexed on
2010/04/16
2:33 UTC
Read the original article
Hit count: 452
Hi, So I got this situation which sucks. I have an XML like this
<table border="1" cols="200 100pt 200">
<tr>
<td>isbn</td>
<td>title</td>
<td>price</td>
</tr>
<tr>
<td />
<td />
<td>
<span type="champsimple" id="9b297fb5-d12b-46b1-8899-487a2df0104e" categorieid="a1c70692-0427-425b-983c-1a08b6585364" champcoderef="01f12b93-b4c5-401b-9da1-c9385d77e43f">
[prénom]
</span>
<span type="champsimple" id="e103a6a5-d1be-4c34-8a54-d234179fb4ea" categorieid="a1c70692-0427-425b-983c-1a08b6585364" champcoderef="01f12b93-b4c5-401b-9da1-c9385d77e43f">[nom]</span>
<span></span>
</td>
</tr>
<tr></tr>
<tr>
<td></td>
<td>Phill It in</td>
</tr>
<tr>
<table id="cas1">
<tr>
<td ></td>
<td >foo</td>
</tr>
<tr>
<td >bar</td>
<td >boo</td>
</tr>
</table>
</tr>
<tr>
<table id="cas2">
<tr>
<td ></td>
<td >foo</td>
</tr>
<tr>
<td ></td>
<td >boo</td>
</tr>
</table>
</tr>
<tr>
<table id="cas3">
<tr>
<td >bar</td>
<td ></td>
</tr>
<tr>
<td >foo</td>
<td >boo</td>
</tr>
</table>
</tr>
<tr>
<table id="cas4">
<tr>
<td />
<td />
</tr>
<tr>
<td>foo</td>
<td>boo</td>
</tr>
</table>
</tr>
<table id="cas4">
<tr>
<td />
<td />
</tr>
<tr>
<td>foo</td>
<td>boo</td>
</tr>
</table>
<tr>
<td />
<td />
</tr>
</table>
Now the question is how would I recursively delete all empty td, tr and table elements?
Now I use this XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="td[not(node())]" />
<xsl:template match="tr[not(node())]" />
<xsl:template match="table[not(node())]" />
</xsl:stylesheet>
But it doesn't do very well. After I delete td, a tr becomes empty but it doesn't handle that. Too bad. See the table element with "cas4".
<table border="1" cols="200 100pt 200">
<tr>
<td>isbn</td>
<td>title</td>
<td>price</td>
</tr>
<tr>
<td>
<span type="champsimple" id="9b297fb5-d12b-46b1-8899-487a2df0104e" categorieid="a1c70692-0427-425b-983c-1a08b6585364" champcoderef="01f12b93-b4c5-401b-9da1-c9385d77e43f">
[prénom]
</span>
<span type="champsimple" id="e103a6a5-d1be-4c34-8a54-d234179fb4ea" categorieid="a1c70692-0427-425b-983c-1a08b6585364" champcoderef="01f12b93-b4c5-401b-9da1-c9385d77e43f">[nom]</span>
<span />
</td>
</tr>
<tr>
<td>Phill It in</td>
</tr>
<tr>
<table id="cas1">
<tr>
<td>foo</td>
</tr>
<tr>
<td>bar</td>
<td>boo</td>
</tr>
</table>
</tr>
<tr>
<table id="cas2">
<tr>
<td>foo</td>
</tr>
<tr>
<td>boo</td>
</tr>
</table>
</tr>
<tr>
<table id="cas3">
<tr>
<td>bar</td>
</tr>
<tr>
<td>foo</td>
<td>boo</td>
</tr>
</table>
</tr>
<tr>
<table id="cas4">
<tr />
<tr>
<td>foo</td>
<td>boo</td>
</tr>
</table>
</tr>
<table id="cas4">
<tr />
<tr>
<td>foo</td>
<td>boo</td>
</tr>
</table>
<tr />
</table>
How would you solve this problem?
© Stack Overflow or respective owner