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

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

  1. Ralf Wahner

    Ralf Wahner Guest

    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
     
    Ralf Wahner, Jul 15, 2003
    #1
    1. Advertising

  2. Ralf Wahner

    Marrow Guest

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




    "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 >
    > <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
     
    Marrow, Jul 15, 2003
    #2
    1. Advertising

  3. Ralf Wahner

    Ralf Wahner Guest

    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
    #3
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. BH
    Replies:
    1
    Views:
    369
    Srinivasa Reddy K Ganji
    Jul 21, 2003
  2. Matze
    Replies:
    2
    Views:
    489
    Matze
    Nov 17, 2003
  3. Replies:
    1
    Views:
    7,309
    David Wahler
    Apr 22, 2006
  4. Ruthless

    branching XSLT tree

    Ruthless, Dec 30, 2003, in forum: XML
    Replies:
    5
    Views:
    535
    Ruthless
    Jan 3, 2004
  5. Kevin McCarty
    Replies:
    0
    Views:
    311
    Kevin McCarty
    Oct 5, 2012
Loading...

Share This Page