How to simplify?

H

Hvid Hat

Hi

I've got the following XSLT that works but I'm trying to figure out how to
simplify it. There is only one Image, so I don't need the for-each-loop.
Anyone?

<xsl:for-each select="Data[@Name='Image']/img">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:attribute name="class">right</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:for-each>

The code adds a class attribute named right to the given img-tag.
 
M

Martin Honnen

Hvid said:
I've got the following XSLT that works but I'm trying to figure out how to
simplify it. There is only one Image, so I don't need the for-each-loop.
Anyone?

<xsl:for-each select="Data[@Name='Image']/img">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:attribute name="class">right</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:for-each>

xsl:copy needs a context node so I don't think you can get rid of the
xsl:for-each as that sets up the 'img' element as the context node.
If that stylesheet creates HTML or XHTML then you could drop the
xsl:apply-templates as 'img' elements in HTML or XHTML are empty.
 
H

Hvid Hat

xsl:copy needs a context node so I don't think you can get rid of the
xsl:for-each as that sets up the 'img' element as the context node.
If that stylesheet creates HTML or XHTML then you could drop the
xsl:apply-templates as 'img' elements in HTML or XHTML are empty.

Too bad. The for-each kinda tortures my eyes when knowing there's only one
element :) Thanks for the tip about removing apply-templates.

I've just sent another message to the group about something related. Maybe
you could answer it? Is it somehow possible to write a generic template that
adds a given attribute name with a given attribute value to a give node? E.g.
if I had a node, e.g. <node id="1"/>, then I'd like to call a template with
this node and attribute name/value like class/blue and the result would be
<node id="1" class="blue" />.

Otherwise I'm thinking about doing it with C# code in the XSLT but I'd like
to avoid C# if possible.
 
P

Peter Flynn

Hvid said:
Too bad. The for-each kinda tortures my eyes when knowing there's only one
element :) Thanks for the tip about removing apply-templates.

I've just sent another message to the group about something related. Maybe
you could answer it? Is it somehow possible to write a generic template that
adds a given attribute name with a given attribute value to a give node? E.g.
if I had a node, e.g. <node id="1"/>, then I'd like to call a template with
this node and attribute name/value like class/blue and the result would be
<node id="1" class="blue" />.

Otherwise I'm thinking about doing it with C# code in the XSLT but I'd like
to avoid C# if possible.

<xsl:template match="*"> can be used to catch all nodes not otherwise
specified in your XSL[T] document.

Otherwise write a named template that does what you need, and use
xsl:call-template at the relevant point in the processing of all your
other templates.

///Peter
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,575
Members
45,053
Latest member
billing-software

Latest Threads

Top