Subject: Re: How to remove (in addition) empty attributes?
From: "Ben Stover" <bxstover@xxxxxxxxxxx>
Date: Thu, 10 Dec 2009 13:24:50 +0100
|
Hi Syd,
are you sure that the (your) line should look like
<xsl:template match="*[normalize-space( concat(.,@*) )='']"/>
and not like
<xsl:template match="@*[normalize-space( concat(.,@*) )='']"/>
Mind the @
Ben
On Thu, 3 Dec 2009 08:50:06 -0500, Syd Bauman wrote:
>Ah, guess I was answering a slightly different question. If you are
>trying to kill any element that has either no child nodes at all, or
>has only child attribute nodes that are empty, perhaps
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
> <xsl:output indent="yes"/>
> <xsl:template match="@* | node()">
> <xsl:copy>
> <xsl:apply-templates select="@* | node()"/>
> </xsl:copy>
> </xsl:template>
> <xsl:template match="*[normalize-space( concat(.,@*) )='']"/>
> </xsl:stylesheet>
>will do the trick.
>The first part is a typical identity transform. The last template
>there matches any element whose content & attribute values combined
>consist of nothing other than whitespace.
>There may be better ways to do this, but I think it does what you
>want.
>> The problem with this is that only elements OR attributes are
>> stripped but not both at the same time.
>> Assume the following XML source:
>> <ns11:elem1 myattr="">
>> <ns22:subelem2 />
>> <ns22:subelem3></ns22:subelem3>
>> </ns11:elem1>
>> Then applying the XSLT script below will result in
>> <ns11:elem1>
>> </ns11:elem1>
>> As you can see the ns11:elem1 persists.
>> It is handled only in the remove attribute template and does not
>> match the other remove-empty-element template.
>> So how can I iteratively/recursively re-apply the script/templates
>> on the result again?
>> XSLT script:
>> <?xml version="1.0"?>
>> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
>> <xsl:output indent="yes"/>
>> <xsl:template match="@*[normalize-space(.)='']"/>
>> <xsl:template match="*[not(node())]"/>
>> <xsl:template match="@* | node()">
>> <xsl:copy>
>> <xsl:apply-templates select="@* | node()"/>
>> </xsl:copy>
>> </xsl:template>
>> </xsl:stylesheet>
| Current Thread |
- <Possible follow-ups>
- Wendell Piez - 3 Dec 2009 20:19:26 -0000
|
|