This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Can you apply a template match on a copy node?
- From: "Mike Carlisle" <swflash at hotmail dot com>
- To: <xsl-list at lists dot mulberrytech dot com>
- Date: Fri, 20 Sep 2002 20:24:34 +0100
- Subject: Re: [xsl] Can you apply a template match on a copy node?
- References: <005e01c25fea$32469e30$6401a8c0@pcukmka>
- Reply-to: xsl-list at lists dot mulberrytech dot com
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