Re: [xsl] convert nested elements, ID's and classes to CSS declaration

Subject: Re: [xsl] convert nested elements, ID's and classes to CSS declaration
From: xslt user <xsltacct@xxxxxxxxx>
Date: Wed, 21 Mar 2007 13:08:45 -0700 (PDT)
Thanks! I was working on this in the background before
I got a chance to read the replies and came up with
pretty much the exact same solution... :)  I added in
ignoring text nodes also.

<?xml version="1.0" encoding="utf-8"
standalone="yes"?>
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="xml" version="1.0"
encoding="utf-8" omit-xml-declaration="yes"
standalone="no" indent="no" media-type="text/xml"/>

<xsl:template match="/">
/*---  ---*/
<xsl:apply-templates/>
/*---  ---*/
</xsl:template>

<xsl:template match="node()">
<xsl:for-each select="ancestor-or-self::*">
<xsl:value-of select="name(.)"/><xsl:text> </xsl:text>
<xsl:if test="@id">#<xsl:value-of
select="@id"/><xsl:text> </xsl:text></xsl:if>
<xsl:if test="@class">.<xsl:value-of
select="@class"/><xsl:text> </xsl:text></xsl:if>
</xsl:for-each>
<xsl:text>{  }
</xsl:text>
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="text()">
<xsl:apply-templates/>
</xsl:template>

</xsl:transform>



I'll have to take a closer look at Michael Kay's
response too.  I'm using xslt 1.0 for now but maybe
the &#xa is better?



XSLT 1.0 or 2.0? Here's a 2.0 solution, untested:

<xsl:template match="*">
 <xsl:apply-templates
select="ancestor-or-self::*/(.|@class|@id)"
mode="token"/>
 <xsl:text>&#xa;</xsl:text>
</xsl:template>

<xsl:template match="*" mode="token">
  <xsl:value-of select="concat(name(), ' ')"/>
</xsl:template>

<xsl:template match="@class" mode="token">
  <xsl:value-of select="concat('.', ., ' ')"/>
</xsl:template>

<xsl:template match="@id" mode="token">
  <xsl:value-of select="concat('#', ., ' ')"/>
</xsl:template>

Michael Kay
http://www.saxonica.com/



--- Jay Bryant <jay@xxxxxxxxxxxx> wrote:

> > Hello,
> >
> > I searched for this all over and couldn't find a
> > solution.  I want to take the following XML:
> >
> > <root>
> > <file>
> > <element/>
> > </file>
> > <file id="a">
> > <element id="a"/>
> > </file>
> > <file class="b">
> > <element class="b"/>
> > </file>
> > <file id="c" class="d" not="1" this="2">
> > <element id="c" class="d" not="1" this="2"/>
> > </file>
> > </root>
> >
> >
> > #### and output something this ####
> >
> >
> > root
> > root file
> > root file element
> > root file #a
> > root file #a element #a
> > root file .b
> > root file .b element .b
> > root file #c .d
> > root file #c .d element #c .d
> >
> >
> > #### ignoring any attributes that are not "id" or
> > "class" and containing all ancestor elements and
> id's
> > and classes no matter what the element name is or
> how
> > many levels deep.  I'd like to use this for auto
> > generating CSS declarations from XHTML snipits, I
> can
> > deal with removing redundant rows manually.  Below
> is
> > the closest I've gotten which only strips the XML
> to
> > the elements and attributes I'm interested in, but
> > doesn't format it or list ancestor elements, id's
> and
> > classes (I'm a beginner at XSLT) thanks! ####
> >
> >
> > <xsl:template match="node()|@id|@class">
> > <xsl:copy>
> > <xsl:apply-templates select="node()|@id|@class"/>
> > </xsl:copy>
> > </xsl:template>
> 
> Here's one way:
> 
> <?xml version="1.0"?>
> <xsl:stylesheet version="1.0" 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> 
> <xsl:output method="text" indent="no"/>
> 
> <xsl:template match="*">
> <xsl:for-each select="ancestor-or-self::*">
> <xsl:value-of select="name()"/><xsl:text>
> </xsl:text>
> <xsl:if test="@id">#<xsl:value-of
> select="@id"/><xsl:text> 
> </xsl:text></xsl:if>
> <xsl:if test="@class">.<xsl:value-of
> select="@class"/><xsl:text> 
> </xsl:text></xsl:if>
> </xsl:for-each>
> <xsl:apply-templates/>
> </xsl:template>
> 
> </xsl:stylesheet>
> 
> Jay Bryant
> Bryant Communication Services 
> 
> 



 
____________________________________________________________________________________
Expecting? Get great news right away with email Auto-Check. 
Try the Yahoo! Mail Beta.
http://advision.webevents.yahoo.com/mailbeta/newmail_tools.html 

Current Thread