|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] RE: Entity Questions
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[@NAME=$textname] !=''" >
> <xsl:value-of select="DATA/VERSION/ITEM[@NAME=$textname]" />
> </xsl:if>
> </xsl:template>
>
> Thanks,
>
> Luke
>
> ----- Original Message -----
> From: "David Carlisle" <davidc@xxxxxxxxx>
> To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
> Sent: Monday, January 17, 2005 11:29 AM
> Subject: Re: 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
> >
> ______________________________________________________________
> __________
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








