Dimitre,
I appreciate your help, and apologize if i was unclear. Your solution
inverted the input/output markup.
This is my XML source:
<emphasis bold="Yes" italic="Yes" underline="Yes">Hello</emphasis>
and this is the desired result of the transformation:
<u><i><b>Hello</b></i></u>
Your template is very intriguing, and i will try to work out the inverted
procedure myself, but certainly welcome your help!
Thanks!
Marty
> -----Original Message-----
> From: Dimitre Novatchev [mailto:dnovatchev@xxxxxxxxx]
> Sent: Tuesday, November 06, 2001 12:43 AM
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: matching multiple times, outputting once?
>
>
> Here's the solution to your problem:
>
> xml source document:
> -------------------
> <contents>
> <b>Hello</b>
> <i><b>Hello</b></i>
> <u><i><b>Hello</b></i></u>
> </contents>
>
>
> Stylesheet:
> ----------
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> xmlns:trans="myTrans" exclude-result-prefixes="trans"
> >
>
> <xsl:output indent="yes" omit-xml-declaration="yes"/>
>
> <trans:trans>
> <in>b</in>
> <out>bold</out>
> <in>i</in>
> <out>italic</out>
> <in>u</in>
> <out>underline</out>
> </trans:trans>
>
> <xsl:variable name="vTrans" select="document('')/*/trans:*"/>
>
> <xsl:template match="b | i | u">
> <emphasis>
> <xsl:apply-templates select="." mode="emph"/>
> </emphasis>
> </xsl:template>
>
> <xsl:template match="b | i | u" mode="emph">
> <xsl:variable name="vEmphName"
> select="$vTrans/in[. = name(current())]
> /following-sibling::out[1]"/>
> <xsl:attribute name="{$vEmphName}">yes</xsl:attribute>
> <xsl:apply-templates mode="emph"/>
> </xsl:template>
>
> </xsl:stylesheet>
>
>
> Result:
> ------
> <emphasis bold="yes">Hello</emphasis>
> <emphasis italic="yes" bold="yes">Hello</emphasis>
> <emphasis underline="yes" italic="yes" bold="yes">Hello</emphasis>
>
>
> Hope this helped.
>
> Cheers,
> Dimitre Novatchev.
>
>
> "McKeever, Marty" <marty dot mckeever at bankofamerica dot com> wrote:
>
> This is really bugging me, because i thought it would be
> simple. Maybe it
> is, and i'm just having a mental block -- thanks for your help.
>
> Here are 3 possibilities that i have to match for, and 3
> desired outputs:
>
> <emphasis bold="Yes">Hello</emphasis>
> <emphasis bold="Yes" italic="Yes">Hello</emphasis>
> <emphasis bold="Yes" italic="Yes" underline="Yes">Hello</emphasis>
>
> <b>Hello</b>
> <i><b>Hello</b></i>
> <u><i><b>Hello</b></i></u>
>
> and every possible combination thereof.
>
>
> I have had no luck writing an intelligent template rule for
> these -- the
> only way i've found so far is a deeply nested <xsl:choose>
> which takes every
> possible combination into account. This can't be the best
> way to do this.
>
> Everything else i've tried either matches only one rule, or
> outputs "Hello"
> multiple times, one for each style.
>
> There has to be an elegant solution i'm missing...
>
> (and yes, i know i could easily write this out as <span
> style="font-style:bold,italic;text-decoration:underline">Hello
> </span>, but
> that's not what i'm looking for here.)
>
> TIA!
> marty
>
>
>
>
> __________________________________________________
> Do You Yahoo!?
> Find a job, post your resume.
> http://careers.yahoo.com
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|