;; $Id: dbbibl.dsl,v 1.5 2003/01/15 08:24:13 adicarlo Exp $
;;
;; This file is part of the Modular DocBook Stylesheet distribution.
;; See ../README or http://docbook.sourceforge.net/projects/dsssl/
;;
;; ......................... BIBLIOGRAPHY PARAMS .........................
;; these should be in dbparam...
(define %biblsep% ", ")
(define %biblend% ".")
(define bibltable #f)
(define (bibliography-table)
(let* ((bibliography (ancestor-member (current-node)
(list (normalize "bibliography"))))
(biblpi (dbhtml-value bibliography "bibliography-format")))
(and (or bibltable (equal? biblpi "table"))
(not (equal? biblpi "list")))))
(define %biblioentry-in-entry-order% #t)
;; .................... BIBLIOGRAPHY and BIBLIODIV ......................
(define (bibliography-content)
;; Note that the code below works for both the case where the bibliography
;; has BIBLIODIVs and the case where it doesn't, by the slightly subtle
;; fact that if it does, then allentries will be (empty-node-list).
(let* ((allbibcontent (children (current-node)))
(prebibcontent (node-list-filter-by-not-gi
allbibcontent
(list (normalize "biblioentry")
(normalize "bibliomixed"))))
(allentries (node-list-filter-by-gi
allbibcontent
(list (normalize "biblioentry")
(normalize "bibliomixed"))))
(entries (if biblio-filter-used
(biblio-filter allentries)
allentries)))
(make sequence
(process-node-list prebibcontent)
(if (bibliography-table)
(make element gi: "TABLE"
attributes: '(("BORDER" "0"))
(process-node-list entries))
(process-node-list entries)))))
(element (book bibliography)
(let ((title (element-title-sosofo (current-node)))
(body (make sequence
(make element gi: "A"
attributes: (list (list "NAME" (element-id)))
(empty-sosofo))
($component-separator$)
($component-title$)
(bibliography-content))))
(html-document title body)))
(element (article bibliography)
(let ((title (element-title-sosofo (current-node)))
(body (make sequence
(make element gi: "A"
attributes: (list (list "NAME" (element-id)))
(empty-sosofo))
($component-separator$)
($component-title$)
(bibliography-content))))
(html-document title body)))
(element bibliography
;; A bibliography that's inside something else...or root
(if (sgml-root-element? (current-node))
(let ((title (element-title-sosofo (current-node)))
(body (make sequence
(make element gi: "A"
attributes: (list (list "NAME"
(element-id)))
(empty-sosofo))
($component-separator$)
($component-title$)
(bibliography-content))))
(html-document title body))
(let* ((sect (ancestor-member (current-node)
(append (section-element-list)
(component-element-list))))
(hlevel (+ (SECTLEVEL sect) 1))
(helem (string-append "H" (number->string (+ hlevel 1)))))
(make sequence
(make element gi: helem
(make element gi: "A"
attributes: (list (list "NAME" (element-id)))
(element-title-sosofo (current-node))))
(bibliography-content)))))
(element (bibliography title) (empty-sosofo))
(element bibliodiv
(let* ((allentries (node-list-filter-by-gi (children (current-node))
(list (normalize "biblioentry")
(normalize "bibliomixed"))))
(entries (if biblio-filter-used
(biblio-filter allentries)
allentries)))
(if (and biblio-filter-used (node-list-empty? entries))
(empty-sosofo)
(make sequence
($section-separator$)
($section-title$)
(if (bibliography-table)
(make element gi: "TABLE"
attributes: '(("BORDER" "0"))
(process-node-list entries))
(process-node-list entries))))))
(element (bibliodiv title) (empty-sosofo))
;; ..................... BIBLIOGRAPHY ENTRIES .........................
(define (biblioentry-inline-sep node rest)
;; Output the character that should separate inline node from rest
(cond
((and (equal? (gi node) (normalize "title"))
(equal? (gi (node-list-first rest)) (normalize "subtitle")))
(make element gi: "I"
(literal ": ")))
(else
(literal %biblsep%))))
(define (biblioentry-inline-end blocks)
;; Output the character that should occur at the end of inline
(literal %biblend%))
(define (biblioentry-block-sep node rest)
;; Output the character that should separate block node from rest
(empty-sosofo))
(define (biblioentry-block-end)
;; Output the character that should occur at the end of block
(empty-sosofo))
(define (nontable-biblioentry
xreflabel leading-abbrev inline-children block-children)
(let ((has-leading-abbrev?
(not (or (node-list-empty? leading-abbrev) biblio-number))))
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
(make element gi: "A"
attributes: (list (list "NAME" (element-id)))
(empty-sosofo))
(make element gi: "P"
(if (or biblio-number xreflabel has-leading-abbrev?)
(make sequence
(literal "[")
(if biblio-number
(literal (number->string (bibentry-number
(current-node))))
(empty-sosofo))
(if xreflabel
(literal xreflabel)
(empty-sosofo))
(if has-leading-abbrev?
(with-mode biblioentry-inline-mode
(process-node-list leading-abbrev))
(empty-sosofo))
(literal "]")
(make entity-ref name: "nbsp"))
(empty-sosofo))
(let loop ((nl inline-children))
(if (node-list-empty? nl)
(empty-sosofo)
(make sequence
(with-mode biblioentry-inline-mode
(process-node-list (node-list-first nl)))
(if (node-list-empty? (node-list-rest nl))
(biblioentry-inline-end block-children)
(biblioentry-inline-sep (node-list-first nl)
(node-list-rest nl)))
(loop (node-list-rest nl))))))
(make element gi: "DIV"
attributes: '(("CLASS" "BIBLIOENTRYBLOCK")
("STYLE" "margin-left: 0.5in"))
(let loop ((nl block-children))
(if (node-list-empty? nl)
(empty-sosofo)
(make sequence
(with-mode biblioentry-block-mode
(process-node-list (node-list-first nl)))
(if (node-list-empty? (node-list-rest nl))
(biblioentry-block-end)
(biblioentry-block-sep (node-list-first nl)
(node-list-rest nl)))
(loop (node-list-rest nl)))))))))
(define (table-biblioentry
xreflabel leading-abbrev inline-children block-children)
(let ((has-leading-abbrev?
(not (or (node-list-empty? leading-abbrev) biblio-number))))
(make element gi: "TR"
(make element gi: "TD"
attributes: '(("ALIGN" "LEFT")
("VALIGN" "TOP")
("WIDTH" "10%"))
(make element gi: "A"
attributes: (list (list "NAME" (element-id)))
(empty-sosofo))
(if (or biblio-number xreflabel has-leading-abbrev?)
(make sequence
(literal "[")
(if biblio-number
(literal (number->string (bibentry-number
(current-node))))
(empty-sosofo))
(if xreflabel
(literal xreflabel)
(empty-sosofo))
(if has-leading-abbrev?
(with-mode biblioentry-inline-mode
(process-node-list leading-abbrev))
(empty-sosofo))
(literal "]"))
(make entity-ref name: "nbsp")))
(make element gi: "TD"
attributes: '(("ALIGN" "LEFT")
("VALIGN" "TOP")
("WIDTH" "90%"))
(make element gi: "P"
(let loop ((nl inline-children))
(if (node-list-empty? nl)
(empty-sosofo)
(make sequence
(with-mode biblioentry-inline-mode
(process-node-list (node-list-first nl)))
(if (node-list-empty? (node-list-rest nl))
(biblioentry-inline-end block-children)
(biblioentry-inline-sep (node-list-first nl)
(node-list-rest nl)))
(loop (node-list-rest nl))))))
(let loop ((nl block-children))
(if (node-list-empty? nl)
(empty-sosofo)
(make sequence
(with-mode biblioentry-block-mode
(process-node-list (node-list-first nl)))
(if (node-list-empty? (node-list-rest nl))
(biblioentry-block-end)
(biblioentry-block-sep (node-list-first nl)
(node-list-rest nl)))
(loop (node-list-rest nl)))))
(if (node-list-empty? block-children)
(empty-sosofo)
(make element gi: "P"
;; get the table row spacing right
(empty-sosofo)))))))
(element biblioentry
(let* ((expanded-children (expand-children
(children (current-node))
(biblioentry-flatten-elements)))
(all-inline-children (if %biblioentry-in-entry-order%
(titlepage-gi-list-by-nodelist
(biblioentry-inline-elements)
expanded-children)
(titlepage-gi-list-by-elements
(biblioentry-inline-elements)
expanded-children)))
(block-children (if %biblioentry-in-entry-order%
(titlepage-gi-list-by-nodelist
(biblioentry-block-elements)
expanded-children)
(titlepage-gi-list-by-elements
(biblioentry-block-elements)
expanded-children)))
(leading-abbrev (if (equal? (normalize "abbrev")
(gi (node-list-first
all-inline-children)))
(node-list-first all-inline-children)
(empty-node-list)))
(inline-children (if (node-list-empty? leading-abbrev)
all-inline-children
(node-list-rest all-inline-children)))
(has-leading-abbrev? (not (node-list-empty? leading-abbrev)))
(xreflabel (if (or has-leading-abbrev? biblio-number)
#f
(attribute-string (normalize "xreflabel")))))
(if (bibliography-table)
(table-biblioentry xreflabel leading-abbrev inline-children block-children)
(nontable-biblioentry xreflabel leading-abbrev inline-children block-children))))
(mode biblioentry-inline-mode
(element abbrev
(make sequence
(process-children)))
(element affiliation
(let ((inline-children (node-list-filter-by-not-gi
(children (current-node))
(list (normalize "address")))))
(let loop ((nl inline-children))
(if (node-list-empty? nl)
(empty-sosofo)
(make sequence
(process-node-list (node-list-first nl))
(if (node-list-empty? (node-list-rest nl))
(empty-sosofo)
(literal ", "))
(loop (node-list-rest nl)))))))
(element artpagenums
(make sequence
(process-children)))
(element author
(make element gi: "SPAN"
attributes: '(("CLASS" "AUTHOR"))
(literal (author-list-string))))
(element authorgroup
(process-children))
(element authorinitials
(make sequence
(process-children)))
(element collab
(let* ((nl (children (current-node)))
(collabname (node-list-first nl))
(affil (node-list-rest nl)))
(make sequence
(process-node-list collabname)
(if (node-list-empty? affil)
(empty-sosofo)
(let loop ((nl affil))
(if (node-list-empty? nl)
(empty-sosofo)
(make sequence
(literal ", ")
(process-node-list (node-list-first nl))
(loop (node-list-rest nl)))))))))
(element (collab collabname)
(process-children))
(element confgroup
(let ((inline-children (node-list-filter-by-not-gi
(children (current-node))
(list (normalize "address")))))
(let loop ((nl inline-children))
(if (node-list-empty? nl)
(empty-sosofo)
(make sequence
(process-node-list (node-list-first nl))
(if (node-list-empty? (node-list-rest nl))
(empty-sosofo)
(literal ", "))
(loop (node-list-rest nl)))))))
(element contractnum
(process-children))
(element contractsponsor
(process-children))
(element contrib
(process-children))
(element copyright
;; Just print the year(s)
(let ((years (select-elements (children (current-node))
(normalize "year"))))
(process-node-list years)))
(element (copyright year)
(make sequence
(process-children)
(if (not (last-sibling? (current-node)))
(literal ", ")
(empty-sosofo))))
(element corpauthor
(make sequence
(process-children)))
(element corpname
(make sequence
(process-children)))
(element date
(make sequence
(process-children)))
(element edition
(make sequence
(process-children)))
(element editor
(make element gi: "SPAN"
attributes: '(("CLASS" "EDITOR"))
(if (first-sibling?)
(make sequence
(literal (gentext-edited-by))
(literal " "))
(empty-sosofo))
(literal (author-list-string))))
(element firstname
(make sequence
(process-children)))
(element honorific
(make sequence
(process-children)))
(element invpartnumber
(make sequence
(process-children)))
(element isbn
(make sequence
(process-children)))
(element issn
(make sequence
(process-children)))
(element issuenum
(make sequence
(process-children)))
(element lineage
(make sequence
(process-children)))
(element orgname
(make sequence
(process-children)))
(element othercredit
(make element gi: "SPAN"
attributes: '(("CLASS" "OTHERCREDIT"))
(literal (author-list-string))))
(element othername
(make sequence
(process-children)))
(element pagenums
(make sequence
(process-children)))
(element productname
(make sequence
($charseq$)
; this is actually a problem since "trade" is the default value for
; the class attribute. we can put this back in in DocBook 5.0, when
; class becomes #IMPLIED
; (if (equal? (attribute-string "class") (normalize "trade"))
; (dingbat-sosofo "trademark")
; (empty-sosofo))
))
(element productnumber
(make sequence
(process-children)))
(element pubdate
(make sequence
(process-children)))
(element publisher
(let ((pubname (select-elements (children (current-node))
(normalize "publishername")))
(cities (select-elements (descendants (current-node))
(normalize "city"))))
(make sequence
(process-node-list pubname)
(if (node-list-empty? cities)
(empty-sosofo)
(literal ", "))
(process-node-list cities))))
(element publishername
(make sequence
(process-children)))
(element (publisher address city)
(make sequence
(process-children)
(if (not (last-sibling? (current-node)))
(literal ", ")
(empty-sosofo))))
(element pubsnumber
(make sequence
(process-children)))
(element releaseinfo
(make sequence
(process-children)))
(element seriesvolnums
(make sequence
(process-children)))
(element subtitle
(make element gi: "I"
(process-children)))
(element surname
(make sequence
(process-children)))
(element title
(make element gi: "I"
(process-children)))
(element titleabbrev
(make sequence
(process-children)))
(element volumenum
(make sequence
(process-children)))
(element (bibliomixed title)
(make element gi: "I"
(process-children)))
(element (bibliomixed subtitle)
(make element gi: "I"
(process-children)))
(element (biblioset title)
(let ((rel (case-fold-up
(inherited-attribute-string (normalize "relation")))))
(cond
((equal? rel "ARTICLE") (make sequence
(literal (gentext-start-quote))
(process-children)
(literal (gentext-end-quote))))
(else (make element gi: "I"
(process-children))))))
(element (bibliomset title)
(let ((rel (case-fold-up
(inherited-attribute-string (normalize "relation")))))
(cond
((equal? rel "ARTICLE") (make sequence
(literal (gentext-start-quote))
(process-children)
(literal (gentext-end-quote))))
(else (make element gi: "I"
(process-children))))))
)
(mode biblioentry-block-mode
(element abstract
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
(process-children)))
(element (abstract title)
(make element gi: "P"
(make element gi: "B"
(process-children))))
(element address
($linespecific-display$ %indent-address-lines% %number-address-lines%))
(element authorblurb
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
(process-children)))
(element printhistory
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
(process-children)))
(element revhistory
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
(make element gi: "TABLE"
attributes: (list
(list "WIDTH" ($table-width$))
(list "BORDER" "0"))
(make sequence
(make element gi: "TR"
(make element gi: "TH"
attributes: '(("ALIGN" "LEFT")
("VALIGN" "TOP")
("COLSPAN" "3"))
(make element gi: "B"
(literal (gentext-element-name
(gi (current-node)))))))
(process-children)))))
(element (revhistory revision)
(let ((revnumber (select-elements (descendants (current-node))
(normalize "revnumber")))
(revdate (select-elements (descendants (current-node))
(normalize "date")))
(revauthor (select-elements (descendants (current-node))
(normalize "authorinitials")))
(revremark (node-list-filter-by-gi
(descendants (current-node))
(list (normalize "revremark")
(normalize "revdescription")))))
(make sequence
(make element gi: "TR"
(make element gi: "TD"
attributes: (list
(list "ALIGN" "LEFT"))
(if (not (node-list-empty? revnumber))
(make sequence
(literal (gentext-element-name-space
(gi (current-node))))
(process-node-list revnumber))
(empty-sosofo)))
(make element gi: "TD"
attributes: (list
(list "ALIGN" "LEFT"))
(if (not (node-list-empty? revdate))
(process-node-list revdate)
(empty-sosofo)))
(make element gi: "TD"
attributes: (list
(list "ALIGN" "LEFT"))
(if (not (node-list-empty? revauthor))
(make sequence
(literal (gentext-revised-by))
(process-node-list revauthor))
(empty-sosofo))))
(make element gi: "TR"
(make element gi: "TD"
attributes: (list
(list "ALIGN" "LEFT")
(list "COLSPAN" "3"))
(if (not (node-list-empty? revremark))
(process-node-list revremark)
(empty-sosofo)))))))
(element (revision revnumber) (process-children-trim))
(element (revision date) (process-children-trim))
(element (revision authorinitials) (process-children-trim))
(element (revision revremark) (process-children-trim))
(element (revision revdescription) (process-children))
(element seriesinfo
;; This is a nearly biblioentry recursively...
(let* ((expanded-children (expand-children
(children (current-node))
(biblioentry-flatten-elements)))
(all-inline-children (if %biblioentry-in-entry-order%
(titlepage-gi-list-by-nodelist
(biblioentry-inline-elements)
expanded-children)
(titlepage-gi-list-by-elements
(biblioentry-inline-elements)
expanded-children)))
(block-children (if %biblioentry-in-entry-order%
(titlepage-gi-list-by-nodelist
(biblioentry-block-elements)
expanded-children)
(titlepage-gi-list-by-elements
(biblioentry-block-elements)
expanded-children)))
(inline-children all-inline-children))
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
(make element gi: "P"
(let loop ((nl inline-children))
(if (node-list-empty? nl)
(empty-sosofo)
(make sequence
(with-mode biblioentry-inline-mode
(process-node-list (node-list-first nl)))
(if (node-list-empty? (node-list-rest nl))
(biblioentry-inline-end block-children)
(biblioentry-inline-sep (node-list-first nl)
(node-list-rest nl)))
(loop (node-list-rest nl))))))
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
(let loop ((nl block-children))
(if (node-list-empty? nl)
(empty-sosofo)
(make sequence
(with-mode biblioentry-block-mode
(process-node-list (node-list-first nl)))
(if (node-list-empty? (node-list-rest nl))
(biblioentry-block-end)
(biblioentry-block-sep (node-list-first nl)
(node-list-rest nl)))
(loop (node-list-rest nl)))))))))
)
(define (nontable-bibliomixed
xreflabel leading-abbrev inline-children)
(let* ((has-leading-abbrev? (not (node-list-empty? leading-abbrev))))
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
(make element gi: "A"
attributes: (list (list "NAME" (element-id)))
(empty-sosofo))
(make element gi: "P"
attributes: (list (list "CLASS" (gi)))
(if (or biblio-number xreflabel has-leading-abbrev?)
(make sequence
(literal "[")
(if biblio-number
(literal (number->string (bibentry-number
(current-node))))
(empty-sosofo))
(if xreflabel
(literal xreflabel)
(empty-sosofo))
(if has-leading-abbrev?
(with-mode biblioentry-inline-mode
(process-node-list leading-abbrev))
(empty-sosofo))
(literal "]")
(make entity-ref name: "nbsp"))
(empty-sosofo))
(with-mode biblioentry-inline-mode
(process-node-list inline-children))))))
(define (table-bibliomixed
xreflabel leading-abbrev inline-children)
(let* ((has-leading-abbrev? (not (node-list-empty? leading-abbrev))))
(make element gi: "TR"
(make element gi: "TD"
attributes: '(("ALIGN" "LEFT")
("VALIGN" "TOP")
("WIDTH" "10%"))
(make element gi: "A"
attributes: (list (list "NAME" (element-id)))
(empty-sosofo))
(if (or biblio-number xreflabel has-leading-abbrev?)
(make sequence
(literal "[")
(if biblio-number
(literal (number->string (bibentry-number
(current-node))))
(empty-sosofo))
(if xreflabel
(literal xreflabel)
(empty-sosofo))
(if has-leading-abbrev?
(with-mode biblioentry-inline-mode
(process-node-list leading-abbrev))
(empty-sosofo))
(literal "]"))
(make entity-ref name: "nbsp")))
(make element gi: "TD"
attributes: '(("ALIGN" "LEFT")
("VALIGN" "TOP")
("WIDTH" "90%"))
(with-mode biblioentry-inline-mode
(process-node-list inline-children))))))
(element bibliomixed
(let* ((all-inline-children (children (current-node)))
(leading-abbrev (if (equal? (normalize "abbrev")
(gi (node-list-first
all-inline-children)))
(node-list-first all-inline-children)
(empty-node-list)))
(inline-children (if (node-list-empty? leading-abbrev)
all-inline-children
(node-list-rest all-inline-children)))
(has-leading-abbrev? (not (node-list-empty? leading-abbrev)))
(xreflabel (if (or has-leading-abbrev? biblio-number)
#f
(attribute-string (normalize "xreflabel")))))
(if (bibliography-table)
(table-bibliomixed xreflabel leading-abbrev inline-children)
(nontable-bibliomixed xreflabel leading-abbrev inline-children))))
;; ....................... BIBLIOGRAPHY ELEMENTS .......................
;; These are element construction rules for bibliography elements that
;; may occur outside of a BIBLIOENTRY or BIBLIOMIXED.
(element bibliomisc (process-children))
(element bibliomset (process-children))
(element biblioset (process-children))
(element bookbiblio (process-children))
(element street ($charseq$))
(element pob ($charseq$))
(element postcode ($charseq$))
(element city ($charseq$))
(element state ($charseq$))
(element country ($charseq$))
(element phone ($charseq$))
(element fax ($charseq$))
(element otheraddr ($charseq$))
(element affiliation ($charseq$))
(element shortaffil ($charseq$))
(element jobtitle ($charseq$))
(element orgdiv ($charseq$))
(element artpagenums ($charseq$))
(element author
(make sequence
(literal (author-list-string))))
(element authorgroup (process-children))
(element collab (process-children))
(element collabname ($charseq$))
(element authorinitials ($charseq$))
(element confgroup (process-children))
(element confdates ($charseq$))
(element conftitle ($charseq$))
(element confnum ($charseq$))
(element confsponsor ($charseq$))
(element contractnum ($charseq$))
(element contractsponsor ($charseq$))
(element copyright
(make sequence
(literal (gentext-element-name (gi (current-node))))
(make entity-ref name: "nbsp")
(dingbat-sosofo "copyright")
(make entity-ref name: "nbsp")
(process-children)))
(element year
(make sequence
(process-children)
(if (not (last-sibling? (current-node)))
(literal ", ")
(literal " "))))
(element holder ($charseq$))
(element corpauthor
(make sequence
(literal (author-list-string))))
(element corpname ($charseq$))
(element date ($charseq$))
(element edition ($charseq$))
(element editor ($charseq$))
(element isbn ($charseq$))
(element issn ($charseq$))
(element invpartnumber ($charseq$))
(element issuenum ($charseq$))
(element legalnotice ($semiformal-object$))
(element (legalnotice title) (empty-sosofo))
(element modespec (empty-sosofo))
(element orgname ($charseq$))
(element othercredit
(make sequence
(literal (author-list-string))))
(element pagenums ($charseq$))
(element contrib ($charseq$))
(element firstname ($charseq$))
(element honorific ($charseq$))
(element lineage ($charseq$))
(element othername ($charseq$))
(element surname ($charseq$))
(element printhistory (empty-sosofo))
(element productname
(make sequence
($charseq$)
; this is actually a problem since "trade" is the default value for
; the class attribute. we can put this back in in DocBook 5.0, when
; class becomes #IMPLIED
; (if (equal? (attribute-string "class") (normalize "trade"))
; (dingbat-sosofo "trademark")
; (empty-sosofo))
))
(element productnumber ($charseq$))
(element pubdate ($charseq$))
(element publisher (process-children))
(element publishername ($charseq$))
(element pubsnumber ($charseq$))
(element releaseinfo (empty-sosofo))
(element revision ($charseq$))
(element revnumber ($charseq$))
(element revremark ($charseq$))
(element revdescription ($block-container$))
(element seriesvolnums ($charseq$))
(element volumenum ($charseq$))
(element (bookbiblio revhistory) ($book-revhistory$))
;; The (element (bookinfo revhistory)) construction rule is in dbinfo.dsl
;; It calls $book-revhistory$...
(define ($book-revhistory$)
(make element gi: "DIV"
attributes: (list
(list "CLASS" (gi)))
(make element gi: "TABLE"
attributes: (list
(list "WIDTH" ($table-width$))
(list "BORDER" "0"))
(make sequence
(make element gi: "TR"
(make element gi: "TH"
attributes: '(("ALIGN" "LEFT")
("VALIGN" "TOP")
("COLSPAN" "3"))
(make element gi: "B"
(literal (gentext-element-name
(gi (current-node)))))))
(process-children)))))
(element (revhistory revision)
(let ((revnumber (select-elements (descendants (current-node))
(normalize "revnumber")))
(revdate (select-elements (descendants (current-node))
(normalize "date")))
(revauthor (select-elements (descendants (current-node))
(normalize "authorinitials")))
(revremark (node-list-filter-by-gi
(descendants (current-node))
(list (normalize "revremark")
(normalize "revdescription")))))
(make sequence
(make element gi: "TR"
(make element gi: "TD"
attributes: (list
(list "ALIGN" "LEFT"))
(if (not (node-list-empty? revnumber))
(make sequence
(literal (gentext-element-name-space
(gi (current-node))))
(process-node-list revnumber))
(empty-sosofo)))
(make element gi: "TD"
attributes: (list
(list "ALIGN" "LEFT"))
(if (not (node-list-empty? revdate))
(process-node-list revdate)
(empty-sosofo)))
(make element gi: "TD"
attributes: (list
(list "ALIGN" "LEFT"))
(if (not (node-list-empty? revauthor))
(make sequence
(literal (gentext-revised-by))
(process-node-list revauthor))
(empty-sosofo))))
(make element gi: "TR"
(make element gi: "TD"
attributes: (list
(list "ALIGN" "LEFT")
(list "COLSPAN" "3"))
(if (not (node-list-empty? revremark))
(process-node-list revremark)
(empty-sosofo)))))))
(element (revision revnumber) (process-children-trim))
(element (revision date) (process-children-trim))
(element (revision authorinitials) (process-children-trim))
(element (revision revremark) (process-children-trim))