|
Subject: Re: transformin CALS tables From: Paul Tyson <ptyso@xxxxxxxxxxxxx> Date: Mon, 27 Mar 2000 22:27:02 -0600 |
You can get rid of the explicit loop by using map-constructor:
(element entry
(let ((current-class
(attribute-string "class" (parent (current-node))))
(entry-nbr (child-number (current-node))))
(make element
gi: "entry"
(sosofo-append
(process-children-trim)
(let ((appended-entry-nl (node-list-filter
(lambda (snl)
(equal?
(child-number snl)
entry-nbr))
(select-elements
(children
(follow (parent (current-node))))
(list
"row"
(list "class" current-class)
"entry")))))
(map-constructor (lambda ()
(sosofo-append
(literal " ")
(process-node-list
(children (current-node)))))
appended-entry-nl))))))
-pt
Paul Tyson wrote:
>
> Hi Jany,
>
> I don't know what your idea of "simple & efficient" is, but here's a set
> of rules that processes your sample data as specified:
>
> (element row
> (let ((current-class (attribute-string "class")))
> (if (node-list-empty? (select-elements
> (preced (current-node))
> (list
> "row"
> (list "class" current-class))))
> (make element
> gi: "row"
> ; if other attributes are expected, change this
> ; to use generic identity transformation
> ; for attribute lists
> attributes: (list (list "class" current-class))
> (process-children))
> ; don't process row if class attribute value
> ; has already appeared
> (empty-sosofo))))
>
> (element entry
> (let ((current-class
> (attribute-string "class" (parent (current-node))))
> (entry-nbr (child-number (current-node))))
> (make element
> gi: "entry"
> (sosofo-append
> (process-children-trim)
> (let loop ((to-do (node-list-filter
> (lambda (snl)
> (equal?
> (child-number snl)
> entry-nbr))
> (select-elements
> (children
> (follow (parent
> (current-node))))
> (list
> "row"
> (list "class" current-class)
> "entry")))))
> (if (node-list-empty? to-do)
> (empty-sosofo)
> (sosofo-append
> (literal " ")
> (process-node-list
> (children (node-list-first to-do)))
> (loop (node-list-rest to-do)))))))))
>
> (element tbody
> (make element gi: "tbody"
> (process-children)))
>
> It might "look" a little simpler if you defined the to-do list and class
> occurrence test as separate procedures, but I think it's got to do the
> same thing no matter how you write it.
>
> As far as general guidelines: of course anything in the grove can be
> processed from any particular construction rule, so the biggest problem
> is avoiding duplicate processing by virtue of the default construction
> rules. In this case, just putting the "if" clause in the row element
> construction rule prevents rows from being processed if the class
> attribute value has been encountered previously. In other cases it's
> easier to use modes.
>
> As long as you're not looping or selecting over large chunks of data,
> this approach seems to work pretty well.
>
> Hope this helps.
>
> Paul Tyson
>
>
> Jany Quintard wrote:
> >
> > Hi all.
> >
> > I have a problem of SGML to SGML transformation. The element to transform
> > are table (derived from cals tables).
> > The input SGML is badly generated and I want to correct this with a dsssl
> > stylesheet. My purpose is to merge the rows that have same class
> > attribute.
> > The use of class attribute is not mandatory, but it seeme a mean to
> > mark the rows that are actually parts of the same row.
> >
> > Suppose I have a table part like this :
> > <tbody>
> > <row class="01">
> > <entry>1 of 01</entry>
> > <entry>2 of 01</entry>
> > <entry>3 of 01</entry>
> > </row>
> >
> > <row class="01">
> > <entry>following of 01-1</entry>
> > <entry>following of 01-2</entry>
> > <entry>following of 01-3</entry>
> > </row>
> >
> > <row class="02">
> > <entry>1 of 02</entry>
> > <entry>2 of 02</entry>
> > <entry>3 of 02</entry>
> > </row>
> > </tbody>
> >
> > I want to
> >
> > What I want is :
> > <tbody>
> > <row class="01">
> > <entry>1 of 01 following of 01-1</entry>
> > <entry>2 of 01 following of 01-2</entry>
> > <entry>3 of 01 following of 01-3</entry>
> > </row>
> >
> > <row class="02">
> > <entry>1 of 02</entry>
> > <entry>2 of 02</entry>
> > <entry>3 of 02</entry>
> > </row>
> > </tbody>
> >
> > I am trying to build a stylesheet to obtain this result. The problem
> > is that my code seems awfully complicated (select-elements, loops and so
> > on) and I am not even sure that it will work.
> >
> > Does anyone have some guidelines to process this in a simple (and
> > efficient) way ?
> >
> > TIA. Jany.
> >
> > DSSSList info and archive: http://www.mulberrytech.com/dsssl/dssslist
>
> DSSSList info and archive: http://www.mulberrytech.com/dsssl/dssslist
DSSSList info and archive: http://www.mulberrytech.com/dsssl/dssslist
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: transformin CALS tables, Paul Tyson | Thread | Re: transformin CALS tables, Jany Quintard |
| Re: transformin CALS tables, Paul Tyson | Date | Re: Jade: How to get a "\tab" in th, Holger Klawitter |
| Month |