RE: [xsl] Transforming an XML document where the content isn't in a special tag

Subject: RE: [xsl] Transforming an XML document where the content isn't in a special tag
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 17 Aug 2005 08:08:29 +0100
> It seems Saxon does'nt seem to handle hetrogeneous sequence
> following-sibling::text()[1] | a properly (I might be wrong..)

yes, you are wrong. Your code has at least three errors:

<xsl:with-param name="nodelist"
> select="following-sibling::text()[1] | a" />

(a) this selects only the first text node, there might be a text node before
the <a> and another one after

(b) it's looking for a elements that are children of <header> rather than
siblings

(c) it doesn't discriminate between nodes that come before the next header
and nodes that come after.

Please see the solutions I posted this morning.

Michael Kay
http://www.saxonica.com/

> 
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="2.0" 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> 	
> <xsl:output method="html" indent="yes"/>
> 	
> <xsl:template match="/root">
>     <html>
>       <head>
>         <title/>
>       </head>
>       <body>
>         <xsl:apply-templates select="header" />        
>       </body>
>     </html>  
> </xsl:template>
> 
> <xsl:template match="header">
>     <h1><xsl:value-of select="." /></h1>
>     <xsl:call-template name="printTextNode">
>       <xsl:with-param name="nodelist"
> select="following-sibling::text()[1] | a" />
>     </xsl:call-template>
> </xsl:template>
>   
> <xsl:template name="printTextNode">
>     <xsl:param name="nodelist" />  
>     <p>
>       <xsl:for-each select="$nodelist">
>         <xsl:choose>
>           <xsl:when test="name() = 'a'">
>             <xsl:copy-of select="." />
>           </xsl:when>
>           <xsl:otherwise>
>             <xsl:value-of select="." />
>           </xsl:otherwise>
>         </xsl:choose>
>       </xsl:for-each>
>     </p>
> </xsl:template>
>   
> </xsl:stylesheet>
> 
> Regards,
> Mukul
> 
> 
> On 8/17/05, Noam Raphael <noamraph@xxxxxxxxx> wrote:
> > Hello,
> > 
> > I'm very new to XSL, so please forgive me if this question 
> is stupid.
> > 
> > I want to transform an XML document which looks like this:
> > 
> > =====================
> > <header>
> > First Section
> > </header>
> > This section deals with a lot of <a href="bla.htm">things</a>.
> > One of them, is...
> > 
> > <header>
> > Second Section
> > </header>
> > Now, this section is different, becase...
> > =====================
> > 
> > into this HTML:
> > 
> > =====================
> > <h1>First Section</h1>
> > <p>This section deals with a lot of <a href="bla.htm">things</a>.
> > One of them, is...</p>
> > <h1>Second Section</h1>
> > <p>Now, this section is different, bacause...</p>
> > =====================
> > 
> > I have a problem with adding the <p></p> tags. The problem is that
> > their locations depends on the <header> tags. I can, of 
> course, add a
> > </p> before a header and a <p> after it, but I'll get an 
> extra one at
> > the beginning and at the end. Can I do this transformation with XSL?
> > (If it matters, I used <xsl:for-each select="text() | *">)
> > 
> > Thank you very much,
> > Noam Raphael

Current Thread