Re: Re: [xsl] How to do an 'existence' test in XSL? - Simple but Generalised

Subject: Re: Re: [xsl] How to do an 'existence' test in XSL? - Simple but Generalised
From: ben@xxxxxxxxxxxxx
Date: Thu, 23 Dec 2004 12:28:20 +0000
I wondered if Mukul's suggestion could be generalised to function on cases where the desired tags in the input xsl may be at any level of nesting e.g. with 'alertBox' we might have :

 <root>
   <othertag>
     <gui type="alertBox"></gui>
   </othertag>
   <gui type="tooltip"></gui>
   <gui type="help"></gui>
   <gui type="tooltip"></gui>
   <othertag>
     <deepertag>
       <gui type="alertBox"></gui>
     </deepertag> 
   </othertag>
   <gui type="tooltip"></gui>
   <gui type="help"></gui>
 </root> 

By changing the gui select in the for-each and the if test from preceeding-sibling to preceeding it (I think) simply scans backwards in the document to see if it has already encountered the type or not. 

 <?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
   
 <xsl:output method="xml" indent="yes" />
   
 <xsl:template match="/root">
   <root>
     <xsl:for-each select="//gui">
       <xsl:if test="not(@type =
 preceding::gui/@type)">
         <xsl:element name="{@type}" />
       </xsl:if>
     </xsl:for-each>
   </root>
 </xsl:template>
   
 </xsl:stylesheet>

I have not tested it exhaustively, but it seems to work perfectly, and does not depend on knowing what types are available beforehand. 

+In what ways might this +not+ be the general solution to the problem?+ 

It is certainly logical, and elegant.

I look forward to your responses with interest.

Dr T.B.Senior


You wrote:
> Here is a simple approach you can try..
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
>   
> <xsl:output method="xml" indent="yes" />
>   
> <xsl:template match="/root">
>   <root>
>     <xsl:for-each select="gui">
>       <xsl:if test="not(@type =
> preceding-sibling::gui/@type)">
>         <xsl:element name="{@type}" />
>       </xsl:if>
>     </xsl:for-each>
>   </root>
> </xsl:template>
>   
> </xsl:stylesheet>
> 
> When the above XSL is applied to XML -
> <?xml version="1.0" encoding="UTF-8"?>
> <root>
>   <gui type="alertBox"></gui>
>   <gui type="tooltip"></gui>
>   <gui type="help"></gui>
>   <gui type="tooltip"></gui>
>   <gui type="alertBox"></gui>
>   <gui type="tooltip"></gui>
>   <gui type="help"></gui>
> </root>  
> 
> The o/p recieved is -
> <?xml version="1.0" encoding="UTF-8"?>
> <root>
>   <alertBox/>
>   <tooltip/>
>   <help/>
> </root>
> 
> Regards,
> Mukul
> 
> --- ben@xxxxxxxxxxxxx wrote:
> 
> > I'm having great difficulty understanding how/if XSL
> > provides the tool to satisfy the following simple
> > requirement. 
> > 
> > Lets say I have some simple xml like :
> > 
> > <gui type="alertBox">...</gui>
> > <gui type="tooltip">...</gui>
> > <gui type="help">...</gui>
> > <gui type="tooltip">...</gui>
> > <gui type="alertBox">...</gui>
> > <gui type="tooltip">...</gui>
> > <gui type="help">...</gui>
> > 
> > To simplify things... imagine transforming this
> > document in such a way that we have something like :
> > 
> > <alertBox/>
> > <tooltip/>
> > <help/>
> > 
> > i.e. I would like the XSL to result in one output
> > per gui type.
> > 
> > So there is the problem... how on earth do I process
> > the xml such that it results in an output per +type+
> > rather than for each instance (is that explained
> > well enough?)... i.e. it's easy to match on the
> > attributes but each match produces output so I would
> > get :
> > 
> > <alertBox/><alertBox/>
> > <tooltip/><tooltip/><tooltip/>
> > <help/><help/>
> > 
> > Can anyone offer advice on the way in which I ought
> > to approach this problem?
> > 
> > Kindest regards,
> > 
> > Ben
> > 
> > 
> 
> 
> 
> 		
> __________________________________ 
> Do you Yahoo!? 
> Yahoo! Mail - Easier than ever with enhanced search. Learn more.
> http://info.mail.yahoo.com/mail_250

Current Thread