|
Subject: Re: transformin CALS tables From: Paul Tyson <ptyso@xxxxxxxxxxxxx> Date: Mon, 27 Mar 2000 22:03:38 -0600 |
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
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| transformin CALS tables, Jany Quintard | Thread | Re: transformin CALS tables, Paul Tyson |
| RE: Checking for a potentially miss, Maltby, David G | Date | Re: transformin CALS tables, Paul Tyson |
| Month |