Re: [xsl] How to remove (in addition) empty attributes?

Subject: Re: [xsl] 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