|
Subject: Re: XML encoding from a DSSSL stylesheets? From: Brandon Ibach <bibach@xxxxxxxxxxxxxx> Date: Tue, 7 Mar 2000 20:23:38 -0600 |
Quoting Stephane Bortzmeyer <bortzmeyer@xxxxxxxxxx>: > but, you're right, I get the complete Processing Instruction and I > don't know enough about DSSSL to extract the relevant part. > > So, I'll add one variable for he encoding and use the -V option of > Jade to allow the user to set it. It duplicates what's already in the > source file but it works. > Try this on your XML file. :) -Brandon :)
<!doctype style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN">
<style-specification id=encoding>
(define debug
(external-procedure "UNREGISTERED::James Clark//Procedure::debug"))
(declare-flow-object-class element
"UNREGISTERED::James Clark//Flow Object Class::element")
(declare-flow-object-class formatting-instruction
"UNREGISTERED::James Clark//Flow Object Class::formatting-instruction")
(declare-characteristic preserve-sdata?
"UNREGISTERED::James Clark//Characteristic::preserve-sdata?" #f)
(define ws '(#\space #\U-0009 #\line-feed #\carriage-return))
; Parses a PI node's system-data, returning a list containing the PI
; target string, the rest of the data minus any leading whitespace,
; and a series of name-value pairs parsed "XML attribute"-style.
; Does *not* check for legal names (using only valid XML name chars).
; Returns #f if the input node list is empty or not a PI.
(define (parse-pi n)
(and (not (node-list-empty? n)) (equal? 'pi (node-property 'classnm n))
(let* ((s (node-property 'system-data n)) (l (string-length s))
(ss (lambda (a b) (substring s a b)))
(ao (lambda (r a) (append r (list a)))))
(let loop ((r '()) (m 0) (p 0) (n 0) (v 0))
(if (>= p l) r (let ((c (string-ref s p))) (case m
; modes: 0=find target 1=skip ws after target 2=find equals 3=check delim
; 4=find ending delim 5=find ending ws 6=skip ws after pair
((0) (if (member c ws) (if (= p 0) (list #f s)
(loop (list (ss 0 p)) 1 (+ p 1) 0 0))
(loop r 0 (+ p 1) 0 0)))
((1) (if (member c ws) (loop r 1 (+ p 1) 0 0)
(loop (ao r (ss p l)) 2 (+ p 1) p 0)))
((2) (if (member c ws)
(loop (ao r (cons (ss n p) "")) 6 (+ p 1) 0 0)
(if (equal? c #\=) (loop r 3 (+ p 1) n (+ p 1))
(loop r 2 (+ p 1) n 0))))
((3) (if (member c ws)
(loop (ao r (cons (ss n (- p 1)) "")) 6 (+ p 1) 0 0)
(loop r (if (member c '(#\" #\')) 4 5) (+ p 1) n p)))
((4) (if (not (equal? c (string-ref s v))) (loop r 4 (+ p 1) n v)
(loop (ao r (cons (ss n (- v 1)) (ss (+ v 1) p)))
6 (+ p 1) 0 0)))
((5) (if (not (member c ws)) (loop r 5 (+ p 1) n v)
(loop (ao r (cons (ss n (- v 1)) (ss v p))) 6 (+ p 1) 0 0)))
((6) (loop r (if (member c ws) 6 2) (+ p 1) p 0)))))))))
(define (cddr x) (cdr (cdr x)))
(define (current-root) (node-property 'grove-root (current-node)))
; (string-interp string char strings...) replaces instances of char
; in string with successive strings. Two successive instances of
; char will instead be replaced by a single instance of char.
; Extra instances of char will be left alone.
(define (string-interp s c #!rest sl)
(let ((e (string-length s)) (ss (lambda (a b) (substring s a b)))
(sa string-append) (sr string-ref))
(let loop ((r "") (b 0) (p 0) (l sl))
(if (or (>= p e) (null? l)) (sa r (ss b e))
(if (not (equal? (sr s p) c)) (loop r b (+ p 1) l)
(if (equal? (sr s (+ p 1)) c)
(loop (sa r (ss b (+ p 1))) (+ p 2) (+ p 2) l)
(loop (sa r (ss b p) (car l)) (+ p 1) (+ p 1) (cdr l))))))))
(root (make formatting-instruction data:
(let ((p (debug (parse-pi (node-list-first (select-by-class
(node-property 'prolog (current-root)) 'pi))))))
(if (not p) "No XML declaration\U-000D;\U-000A;"
(string-interp "Document encoding: %\U-000D;\U-000A;" #\%
(cdr (or (assoc "encoding" (cddr p)) '(#f "[none]"))))))))
</style-specification>
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: XML encoding from a DSSSL style, Stephane Bortzmeyer | Thread | Re: XML encoding from a DSSSL style, Stephane Bortzmeyer |
| [ANNOUNCE] OpenJade 1.3 binaries fo, Alexander Sieb | Date | openjade web pages, Jany Quintard |
| Month |