Collect all the nodes with a specified gi... ¿ ?

Subject: Collect all the nodes with a specified gi... ¿ ?
From: Reyes Garcia Rosado <reyes.garcia@xxxxxxxxxx>
Date: Fri, 01 Oct 1999 09:40:47 +0200
Hello!

I need to take from a tree (SGML instance) all the nodes that have a
specified gi.
I explin it:
I have a SGML instance from a DTD like this:

				   |-- SON-AA
		   |-- SON-A-----|-- *KEY
		   |		   |-- *SON-AB
		   |
     FATHER------|-- SON-B
		   |
		   |		   |-- SON-CA-----KEY
		   |-- SON-C-----|-- *SON-CB
		   		   |		     |-- SON-CCA
		   		   |-- *SON-CC-----|
						     |-- *KEY

and I want to make, with Jade, a SGML instance from the next DTD:

		   |-- COLLECT------ *KEY
		   |
		   |		   |-- SON-AA
		   |-- SON-A-----|-- *KEY
		   |		   |-- *SON-AB
     FATHER------|
		   |-- SON-B
		   |
		   |		   |-- SON-CA-----KEY
		   |-- SON-C-----|-- *SON-CB
		   		   |		     |-- SON-CCA
		   		   |-- *SON-CC-----|
						     |-- *KEY


My problem is collect all the tags with the gi "KEY" (in this case). 
I have made two procedures (they work good):

(element FATHER 
  (make element gi: (gi (current-node))
    (let ((Keys  (filter-by-gi (current-node) '("KEY"))))
	  (make sequence 
	    (make element gi: "COLLECT" (process-collect-key Keys))
	    (process-children)
	  )
    )
  )
)

(define (filter-by-gi nodelist gilist)
	(let loop ((final (empty-node-list)) (nl nodelist))
				 (if (node-list-empty? nl)
						final
						(loop (node-list final (node-list-filter-by-gi nl gilist))
								(children nl))
				  )
	)
)

(define (node-list-filter-by-gi nodelist gilist)
	(let loop ((result (empty-node-list)) (nl nodelist))
				 (if (node-list-empty? nl)
						result
						(if (member (gi (node-list-first nl)) gilist)
							(loop (node-list result (node-list-first nl))
									(node-list-rest nl))
							(loop result (node-list-rest nl))
						)
				  )
	)
)

But, there is a direct way to make this?

Thanks,
	 Reyes


 DSSSList info and archive:  http://www.mulberrytech.com/dsssl/dssslist


Current Thread