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?


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@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

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]