This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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@ntlworld.com>
To: <xsl-list@lists.mulberrytech.com>
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
> Software AG
> home: Michael.H.Kay@ntlworld.com
> work: Michael.Kay@softwareag.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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]