RE: [xsl] Creating nested output from <xsl:if>'s

Subject: RE: [xsl] Creating nested output from <xsl:if>'s
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Sat, 4 Dec 2004 16:19:37 -0000
Firstly, why are you creating the serialized XML "by hand" rather than
constructing a result tree in the normal way? I don't think this is directly
relevant to your problem, but it's very distracting.

The ideal solution is XSLT 2.0 <next-match>

<xsl:template match="prosody[@pitch='x-high']" priority="5">
<PITCH BASE="70%"><xsl:next-match/></PITCH>
</xsl:template> 

<xsl:template match="prosody[@rate='slow']" priority="4">
<RATE SPEED="-40%"><xsl:next-match/></RATE>
</xsl:template>

<xsl:template match="prosody" priority="3">
 <xsl:apply-templates/>
</xsl:template>

In XSLT 1.0 you can do this with xsl:apply-imports, but the drawback is that
each rule has to be in a separate module.

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

> -----Original Message-----
> From: Paul Giannaros [mailto:ceruleanblaze@xxxxxxxxx] 
> Sent: 04 December 2004 03:09
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Creating nested output from <xsl:if>'s
> 
> Sorry for the bad subject line, its pretty hard to explain. 
> Basically i'm transforming one XML language into another. In 
> doing this, I 
> have some code like the following:
> 
> <xsl:template match="//prosody">
>         ...
>     <xsl:choose>
>         <xsl:when test="@pitch='x-high'">
>              <xsl:text>&lt;PITCH BASE="70%"&gt;</xsl:text>
>                   <xsl:apply-templates/>
>              <xsl:text>&lt;/PITCH&gt;</xsl:text>
>         </xsl:when>
>         ...
>     <xsl:choose>
>         <xsl:when test="@rate='slow'">
>              <xsl:text>&lt;RATE SPEED="-40%"&gt;</xsl:text>
>                     <xsl:apply-templates/>
>              <xsl:text>&lt;/RATE&gt;</xsl:text>
>          </xsl:when>
>          ...
> </xsl:template>
> 
> 
> Now this all works fine when using individual prosody tags 
> with one attribute 
> (pitch or rate). The issue arises when doing something like:
> 
> <prosody rate="slow" pitch="x-high">Here is some high, slow 
> speech</prosody>
> 
> The output is the following:
> 
> <PITCH BASE="70%">Here is some high, slow speech</PITCH><RATE 
> SPEED="-40%">Here is some high, slow speech</RATE>
> 
> Obviously not what was wanted (nested tags with the text in them). 
> How can I achieve what I need? If possible, without resorting 
> to templates for 
> each attribute.
> Thanks for your time.

Current Thread