Re: [xsl] Can you apply a template match on a copy node?

Subject: Re: [xsl] Can you apply a template match on a copy node?
From: "Mike Carlisle" <swflash@xxxxxxxxxxx>
Date: Sun, 22 Sep 2002 13:39:03 +0100
Hi Joerg,

The reason for wanting to process <td> in a seperate match was that it could
be used to define a style for <td> in one place, and one place only. Whether
the <td> was in the xml or written by another match I wanted one place where
it's attributes could be set generically, a bit like using xsl as a css.

I'm not that familar with extensions used in Michael Kay's approach. Am I
right in thinking that to use node-set I need to install something like
Xalan.exe, and this will then pass a string back into a node set? How do
these extensions effect efficiency of the tranform? I've been told xsl/xml
transforms are already fairly processor intensive compared to something like
a pure asp solution, so am a bit reluctent to start complicating the process
further with external calls. Dooes anyone know of or have any good bench
marks?

Cheers,

Mike

----- Original Message -----
From: "Joerg Heinicke" <joerg.heinicke@xxxxxx>
To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Sunday, September 22, 2002 12:29 AM
Subject: Re: [xsl] Can you apply a template match on a copy node?


> Hello Mike,
>
> yes this sound like a 2-step processing, if you want to do it exactly in
> the way you described it. But you can also use Michael Kay's approach.
> In general you can't access the created output and if you store the
> output in a variable like in Michael's example you have to use extension
> function.
>
> In my opinion both is not needed. Why you need the step with <td>?? Your
> code would also add the needed attributes to the output. And @width and
> @bgcolor you can add in the template matching on myNode:
>
>  > <xsl:template match="myNode">
>  >     <html><body><table>
>  >       <tr>
>            <td width="500" bgcolor="#3300FF">
>              <xsl:apply-templates select="@*" />
>              <xsl:value-of select="text()" />
>  >         </td>
>          </tr>
>  >     </table></body></html>
>  > </xsl:template>
>
> Or do you see any problem with this approach?
>
> Regards,
>
> Joerg
>
>
> Mike Carlisle wrote:
> > Thank you for the replies.
> >
> > Various reasons include having a generic way of styling html with xsl
when a
> > transform occurs. ie setting up a match to style a tag that can be
defined
> > in once place, and applied to any tags of that type whether in the
orginial
> > data, or written out by another match.
> >
> > I guess what it comes down to is this. I want to apply templates to the
<td>
> > tag created during the "myNode" match.
> >
> > <xsl:template match="myNode">
> >     <html><body><table>
> >       <tr><td><xsl:apply-templates select="???? | @*" />
> >              <xsl:value-of select="text()" />
> >       </td></tr>
> >     </table></body></html>
> > </xsl:template>
> >
> > <xsl:template match="td">
> >     <xsl:copy>
> >       <xsl:attribute name="width">500</xsl:attribute>
> >       <xsl:attribute name="bgcolor">#3300FF</xsl:attribute>
> >     </xsl:copy>
> > </xsl:template>
> >
> > <xsl:template match="@style">
> >     <xsl:attribute name="class"><xsl:value-of select="."
/></xsl:attribute>
> > </xsl:template>
> >
> > <xsl:template match="@*" >
> >     <xsl:copy-of select="." />
> > </xsl:template>
> >
> > This is the plan:
> >
> > The attributes from myNode are transfered to the TD node written out in
the
> > first match, and when the templates are applied again, these copied
> > attributes are processed. This works.
> >
> >     <myNode style="selected">blah</myNode>
> >
> > becomes
> >
> >     <table><tr><td class="selected">blah</td></tr></table>
> >
> > However I also want to apply templates to <td>, so that it becomes:
> >
> > <table><tr><td class="selected" width="500"
> > bgcolor"#3300FF">blah</td></tr></table>
> >
> > Any ideas? Or would this require a two stage passing process?
> >
> > ----- Original Message -----
> > From: "Michael Kay" <michael.h.kay@xxxxxxxxxxxx>
> > To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
> > Sent: Thursday, September 19, 2002 3:38 PM
> > Subject: RE: [xsl] Can you apply a template match on a copy node?
> >
> >
> >
> >>>Wonder if anyone can help. I have an xsl which is applying
> >>>templates on match. One of these templates matches on an
> >>>attribute. For various reasons within this template I want to
> >>>copy the node (filtering out the matched attribute), and then
> >>>apply templates to the copy of this node.
> >>
> >>What are the various reasons?
> >>
> >>By "the node", I assume you mean "the element that owns this attribute".
> >>You can do
> >>
> >><xsl:template match="@x">
> >>  <xsl:variable name="c">
> >>    <xsl:for-each select="..">
> >>      <xsl:copy>
> >>        <xsl:copy-of select="@*[local-name()!='x']"/>
> >>        <xsl:copy-of select="*"/>
> >>      </xsl:copy>
> >>    </xsl:for-each>
> >>  </xsl:variable>
> >>  <xsl:apply-templates select="xx:node-set($c)"/>
> >></xsl:template>
> >>
> >>But I feel sure there is a more straightforward solution to your real
> >>problem.
> >>
> >>Michael Kay
>
>
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
>

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread