- From: Wes Morgan <wmorga13@calvin.edu>
- Date: Fri, 27 Jul 2001 16:07:48 -0400 (EDT)
- To: www-style@w3.org
I received a private response to this asking for more info, so here goes. The best way to show what I'm doing is with an example: Suppose you have the following CSS... p {text-indent:0.3in; margin-top:0pt; margin-bottom:0pt; font-size:13p p.just {text-align:justify} p.center {text-align: center} .greek {font-family:'SIL Galatia'} h1, h2, h3 {text-align: center;} a:link {color: green;} In XCSS, that becomes... <style type="text/xcss"> <selector element="p" class="" pseudo=""> <property name="text-indent" value="0.3in"/> <property name="margin-top" value="0pt"/> <property name="margin-bottom" value="0pt"/> <property name="font-size" value="13pt"/> </selector> <selector element="p" class="just" pseudo=""> <property name="text-align" value="justify"/> </selector> <selector element="p" class="center" pseudo=""> <property name="text-align" value="center"/> </selector> <selector element="" class="greek" pseudo=""> <property name="font-family" value="'SIL Galatia'"/> </selector> <selector element="h1" class="" pseudo=""> <property name="text-align" value="center"/> </selector> <selector element="h2" class="" pseudo=""> <property name="text-align" value="center"/> </selector> <selector element="h3" class="" pseudo=""> <property name="text-align" value="center"/> </selector> <selector element="a" class="" pseudo="link"> <property name="color" value="green"/> </selector> </style> This was auto-generated by a Perl script that converts CSS to XCSS. Now then, the interesting part. When I need to transform this to CSS (for use in HTML, Open EBook, etc.), I apply the following XSLT template to it... <xsl:template match="style[@type = 'text/xcss']"> <xsl:for-each select="selector"> <xsl:value-of select="@element"/><xsl:if test="@class != ''">.<xsl:value-of select="@class"/></xsl:if><xsl:if test="@pseudo != ''">:<xsl:value-of select="@pseudo"/></xsl:if><xsl:text> { </xsl:text><xsl:for-each select="property"><xsl:value-of select="@name"/>: <xsl:value-of select="@value"/>; </xsl:for-each><xsl:text>}
</xsl:text> </xsl:for-each> </xsl:template> That results in plain old CSS. Now, if I am transformming the doc to XSL-FO, then CSS won't work, so I just put this inside the templates that handle elements that can have CSS properties... <fo:block id="{generate-id(.)}"> <xsl:for-each select="//style[@type = 'text/xcss']/selector[(@element = local-name(current()) or @element = '') and (@class = current()/@class or @class = '')]/property"> <xsl:attribute name="{@name}"><xsl:value-of select="@value"/></xsl:attribute> </xsl:for-each> <xsl:apply-templates/> </fo:block> And of course, that's just an example, you can apply that for-each loop to <fo:inline/> as well, where appropriate. In XSL-FO, is there any way to collect style information into a central place like the <style/> element does for HTML? I couldn't find one, so I am putting the above into just about every template in my FO stylesheet. It's a little clunky, but it does work pretty well. One caveat is that you kind of have to restrict yourself to the intersection of CSS and XSL-FO properties for everything to transform correctly. I am probably going to do some conversion in the future, however. Like changing the CSS values "left" and "right" to XSL-FO's "start" and "end" where appropriate. It seems as though this is something which would be useful to others. Is the W3C interested in creating a standard that encompasses this idea? The ability to transform style information with XSLT seems pretty useful. Wes Morgan
Received on Monday, 30 July 2001 10:36:25 UTC