RE: [xsl] Traverse XML Source

Subject: RE: [xsl] Traverse XML Source
From: Mukul Gandhi <mukul_gandhi@xxxxxxxxx>
Date: Tue, 17 Aug 2004 21:43:04 -0700 (PDT)
Hi Karl,
  Please try this XSL -

<?xml version="1.0"?> 
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="1.0">
 
<xsl:output method="xml" indent="yes" /> 
<xsl:strip-space elements="*" />

<xsl:template match="node()">   
   <xsl:for-each select="@*">
     <xsl:attribute name="{name()}">
       <xsl:value-of select="." />
     </xsl:attribute>
   </xsl:for-each>
   <xsl:if test="count(child::*) > 0">
     <ul>
       <xsl:value-of select="name()" />
       <xsl:apply-templates />
     </ul>
   </xsl:if>
   <xsl:if test="count(child::*) = 0">
     <li>
       <xsl:value-of select="name()" />
       <xsl:apply-templates />
     </li>
   </xsl:if>
</xsl:template>
  
</xsl:stylesheet>

Regards,
Mukul

--- "Karl J. Stubsjoen" <karl@xxxxxxxxxxxxxxxxxxxx>
wrote:

> That is a farely predicted result... I don't know to
> what depth the child
> nodes shall occur... but each parent node should be
> a <ul> and each child
> node with child nodes should be a <UL>... with the
> possibility of there
> being sibling <li>'s.
> Here is a better XML source:
> 
> <ABC>
>   <A>
>     <AB/><CD/><EF/>
>   </A>
>   <B>
>     <AB/><CD/><EF/>
>   </B>
>   <C/>
>   <D/>
>   <E/>
> </ABC>
> 
> And the result:
> <ul>ABC
>   <ul>A
>     <li>AB</li>
>     <li>CD</li>
>     <li>EF</li>
>   </ul>
>   <ul>B
>     <li>AB</li>
>     <li>CD</li>
>     <li>EF</li>
>   </ul>
>   <li>C</li>
>   <li>D</li>
>   <li>E</li>
>   <li>F</li>
> </ul>
> 
> 
> -----Original Message-----
> From: cking [mailto:cking@xxxxxxxxxx]
> Sent: Tuesday, August 17, 2004 2:24 PM
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] Traverse XML Source
> 
> 
> Hi Karl,
> 
> there are a few problems with your XSL source:
> it contains two templates with the same match
> attribute
>   <xsl:template match="*">
> which basically means: match any element.
> Template match attributes should be unique,
> otherwise the
> processor does not know which of the two templates
> to use.
> 
> further, your second template has no effect, because
> match="@*"
> means: match any attribute, and your XML source tree
> doesn't
> have any element with attributes.
> 
> you didn't show us the output you expect, but
> something like:
> 
> <xsl:template match="/stuff/abc/def">
>   <ul><xsl:apply-templates/></ul>
> </xsl:template>
> 
> <xsl:template match="path | web | uid | pwd">
>   <li><xsl:value-of select="."/></li>
> </xsl:template>
> 
> will (hopefully) give you this output:
> 
> <ul>
>   <li>\\path-to-server</li>
>   <li>http://my-web-path</li>
>   <li>9999</li>
>   <li>monkeysee</li>
> </ul>
> 
> HTH,
> Anton Triest
> 
> Tuesday, August 17, 2004 10:46 PM,
> karl@xxxxxxxxxxxxxxxxxxxx wrote:
> >
> > Hello,
> > I would like a very simple XSLT transformation
> that traverses an XML
> > source and creates an HTML list output.  Is this
> an identity
> > transformation?
> > So far, I have only been able to get anything to
> happen on the document
> > root, and nothing below is traversed.
> > Thanks for the help.  ~karl
> >
> > Here is what I have so far,
> > XML Source:
> > <stuff>
> > <abc>
> > <def>
> > <path>\\path-to-server</path>
> > <web>http://my-web-path</web>
> > <uid>9999</uid>
> > <pwd>monkeysee</pwd>
> > </def>
> > </abc>
> > </stuff>
> >
> > XSL Source:
> > <xsl:template match="*">
> >   <xsl:copy>
> >     <xsl:apply-templates select="@*" />
> >     <xsl:apply-templates />
> >   </xsl:copy>
> > </xsl:template>
> >
> >
> > <xsl:template match="@*">
> >   <li><xsl:copy-of select="." /></li>
> > </xsl:template>
> >
> > <xsl:template match="*">
> >   <li><xsl:copy-of select="." /></li>
> > </xsl:template>
> >
> > </xsl:stylesheet>



		
__________________________________
Do you Yahoo!?
Yahoo! Mail - Helps protect you from nasty viruses.
http://promotions.yahoo.com/new_mail

Current Thread