xsl-list
[Top] [All Lists]

RE: Entity Questions

2005-01-17 14:02:30
The problem of handling input in which elements such as <b>, <i>, and <u>
can be arbitrarily nested is bread-and-butter for XSLT:

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

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

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

It's not clear from your description, but I think you might be alluding to a
different problem, which is multi-phase or pipeline processing: that is,
producing a temporary tree and then doing another transformation on that.
This works cleanly in XSLT 2.0:

<xsl:variable name="temp">
  <xsl:apply-templates select="/" mode="phase1"/>
</xsl:variable>

<xsl:template match="/">
  <xsl:apply-templates match="$temp" mode="phase2"/>
</xsl:template>

I use two different modes here to keep the template rules for the two phases
of processing separate from each other. Each template rule will be
identified as mode="phaseN" to indicate when it applies.

There's a slight glitch in XSLT 1.0 which doesn't allow this syntax: to get
round the restriction you need to write 

<xsl:template match="/">
  <xsl:apply-templates match="xx:node-set($temp)" mode="phase2"/>
</xsl:template>

where xx:node-set() is an extension function provided by your XSLT vendor.
Every XSLT 1.0 processor provides a function of this kind, but the namespace
varies.




I was thinking about implementing a global find and replace 
function that
would take an input string, target and replacement as params. It would
recurse until all the targets in the string have been 
replaced. I would have
to do this seperately for <p>, <i>, <b> and <font>.

I'm sorry, but I can't see what this code is trying to do at all.

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



Is there an easier approach?

<xsl:template name="text_display_and_edit">
<xsl:param name="text_number" />
<xsl:param name="textname" select="concat('TEXT',$text_number)" />
<xsl:if test="DATA/VERSION/ITEM[(_at_)NAME=$textname] !=''" >
<xsl:value-of select="DATA/VERSION/ITEM[(_at_)NAME=$textname]" />
</xsl:if>
</xsl:template>

Thanks,

Luke

----- Original Message ----- 
From: "David Carlisle" <davidc(_at_)nag(_dot_)co(_dot_)uk>
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
Sent: Monday, January 17, 2005 11:29 AM
Subject: Re: [xsl] Entity Questions



  But I would still like a way to replace a <p> tag with a 
<fo:block>,
etc.
  Can this be done at the XSL level?


XSLT has no access to the tags in the document, they like 
entities, are
resolved by the XML parser before XSLT starts; but 
replacing a p element
by an fo:block one is surely the most basic XSLT operation 
(it is quite
literally) the main application for which XSLT is designed.

<xsl:template match="p"><!-- or h:p if input is in a namespace -->
 <fo:block>
  <xsl:apply-templates/>
 </fo:block>
</xsl:template>

David


______________________________________________________________
__________
This e-mail has been scanned for all viruses by Star. The
service is powered by MessageLabs. For more information on 
a proactive
anti-virus service working around the clock, around the 
globe, visit:
http://www.star.net.uk

______________________________________________________________
__________


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



<Prev in Thread] Current Thread [Next in Thread>