xsl-list
[Top] [All Lists]

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

2002-09-22 05:39:03
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(_dot_)heinicke(_at_)gmx(_dot_)de>
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
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(_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


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


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