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(_dot_)h(_dot_)kay(_at_)ntlworld(_dot_)com>
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)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(_dot_)H(_dot_)Kay(_at_)ntlworld(_dot_)com
work: Michael(_dot_)Kay(_at_)softwareag(_dot_)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