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

Discussion in 'XML' started by Ralf Wahner, Jul 15, 2003.

1. ### Ralf WahnerGuest

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 > <xsltherwise> <!-- process text node --> </xsltherwise> </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 Ralf Wahner, Jul 15, 2003 1. ### Advertising 2. ### MarrowGuest Re: branching node processing with respect to node type possible? 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"> <xslutput 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 "Ralf Wahner" <-heidelberg.de> wrote in message news:... > 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 >
> <xsltherwise>
> <!-- process text node -->
> </xsltherwise>
> </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
Marrow, Jul 15, 2003

3. ### Ralf WahnerGuest

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

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
Ralf Wahner, Jul 15, 2003