xsl-list
[Top] [All Lists]

RE: problem creating containment during XHTML->XML

2004-02-23 16:35:24
Try a search for "XSLT positional grouping" (this is a classic problem).

In XSLT 2.0 this is child's play:

<xsl:for-each-group group-starting-with="heading">

In 1.0 it's quite hard. In the template that matches <heading> you've
got to process all the following siblings up to the next heading. One
way of selecting these is

following-sibling::*[generate-id(preceding-sibling::heading) =
generate-id(current())]

Michael Kay

-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com 
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
Don Stinchfield
Sent: 23 February 2004 22:07
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] problem creating containment during XHTML->XML 


Hello,

I'm having a devil of a time trying to create the right node 
set for my processing.  Any help would be appreciated. :-)

I'm in the process of breaking up an XHTML file into multiple 
XML files. Here's the portion of the input file that's of 
interest (I've already Modified the file by replacing HTML 
headings with a heading tag)...

  [lots of html cruft]
  <heading level="h1"><a name="content" 
id="content"></a>Overview</heading>
    <p>On February 20, 1865</p>
    <p>Education and related research&#8212; 
    <a href="degre.archi.deans.shtml">Architecture and Planning</a>; 
    <a href="degre.engin.deans.shtml">Engineering</a>;</p>
  <heading level="h3"><a name="mission" 
id="mission"></a>Mission</heading>
    <p>The mission of </p>
    <p>The Institute is committed to </p>
  <heading level="h3"> <a name="sf" id="sf"></a>Faculty</heading>
    <p> total enrollment is approximately 10,300 students</p>
    <p>The faculty numbers approximately 956</p>
  [lots of html cruft]

I'm cleaning up a bit and would like to add structure as follows...

  <section>
    <heading level="h1">Overview</heading>
      <p>On February 20, 1865</p>
      <p>Education and related research&#8212;   
      <a href="degre.archi.deans.shtml">Architecture and 
Planning</a>; 
      <a href="degre.engin.deans.shtml">Engineering</a>;</p>
  </section>
  <section>
    <heading level="h3"></a>Mission</heading>
      <p>The mission of </p>
      <p>The Institute is committed to </p>
  </section>
  <section>
    <heading level="h3">Faculty</heading>
      <p> total enrollment is approximately 10,300 students</p>
      <p>The faculty numbers approximately 956</p>
  </section>

In a final phase I'll break the file up.  One xml file per section.

Here's the XSLT file.  I've been working with.

- <xsl:template match="/">
    <xsl:apply-templates select="//x:heading" /> 
  </xsl:template>

- <xsl:template match="x:heading">
  - <section>
  -   <title>
        <xsl:value-of select="." /> 
      </title>
      <xsl:apply-templates select="following-sibling::*" /> 
    </section>
  </xsl:template>

- <xsl:template match="text()|node()|@*">
    <xsl:copy-of select="." /> 
  </xsl:template>

The above puts me in an infinite loop.  I have no idea why.  
I've tried loads of different techniques.  The above seems to 
be close, but I don't know how to stop coping nodes that 
don't belong in a specific section.  I'm thinking I need to 
create a nodeset that contains all following siblings up to 
but not including the next heading tag.  My gut tells me this 
should be easy, but I've been looking at this problem long 
enough that I'm cross eyed. Any help would be appreciated.


Regards,
Don Stinchfield
Red Bridge Interactive, Inc.




 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>