XSLT: branching node processing with respect to node type possible?

R

Ralf Wahner

Dear Masters of XSLT

Could I ask you for a clue on the following question? I'd
like to use XSLT to transform an XML source file to LaTeX.
In the following small example the <para> Element contains
(I think so)

- a text node (node one)
- an element node (node two)
- a text node (node three)

Example:

<para>
Some words or lines of common text with LaTeX special
characters like $, # and _ (underscore) appear before
an element node.
<emph>Attention!</emph>
Take care for converting $ to \$, # to \# and _ to \_
before running latex.
</para>

I'd like to process the nodes in the <para> element content one
after the other with respect to their node type. For text nodes
it's sufficient just to change all occuring special characters,
while the <emph> element node should get e.g. a \textbf{} or
\emph{} before its content will be inserted (self-evidently after
first changing the special characters). In terms of pseudo-XSLT:

<xsl:template match="para">
<xsl:for-each select="."> <!-- get set of childs of para -->
<xsl:choose>
<xsl:when test="emph">
<!-- process element node -->
</xsl:when >
<xsl:eek:therwise>
<!-- process text node -->
</xsl:eek:therwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>

Unfortunately, this works only, when the <emph> element node
is cut out from the above example. I spend about five days but
gained no success. I pressume that my point of view is unfavo-
rable: Given the childs of a element node. Take one after the
other and detect the node type. "Node one is an element node,
node two is a processing instruction, ...".

I'm working with XSLT for several months now, but still haven't
understood how to think/to look at a problem to find an approp-
riate solution in XSLT. I'd gratefully appreciate any hint on
the topic at hand as well as on "Thinking in XSLT".

Thank you very much,

Ralf
 
M

Marrow

Hi Ralf,

The best suggestion would be to avoid using <xsl:for-each> in this type of
processing - your <xsl:choose> might get extremely large, complicated and
unwieldy.

When processing nodes where the order is important but yet different
actions/processing is to take place for each different node then
<xsl:apply-templates> and matching templates is usually the best route, e.g.
a very crude example of processing your XML...

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:eek:utput method="text"/>
<xsl:template match="para">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="emph">
<xsl:text>\emph{</xsl:text>
<xsl:apply-templates/>
<xsl:text>}</xsl:text>
</xsl:template>

<xsl:template match="text()">
<xsl:text>\textbf{</xsl:text>
<xsl:value-of select="."/>
<xsl:text>}</xsl:text>
</xsl:template>
</xsl:stylesheet>

Hope this helps
Marrow
http://www.marrowsoft.com - home of Xselerator (XSLT IDE and debugger)
http://www.topxml.com/Xselerator
 
R

Ralf Wahner

Dear Mr. Marrow

Thank you very much for your reply. You showed me precisely what I
was looking for. I didn't hit on writing an own template for text
as you proposed:

<xsl:template match="text()">
<xsl:text>\textbf{</xsl:text>
<xsl:value-of select="."/>
<xsl:text>}</xsl:text>
</xsl:template>

My only approach in handling pure text content sofar was
<xsl:value-of select=".">. I take the way you treat beginners like
me as a good example. The more I learn the earlier I can contribute
to news group discussions.

Best regards,

Ralf
 

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

No members online now.

Forum statistics

Threads
473,990
Messages
2,570,211
Members
46,796
Latest member
SteveBreed

Latest Threads

Top