(import files setup-api srfi-1 srfi-4 srfi-13 srfi-69) (require-extension datatype matchable ssax sxml-transforms sxpath sxpath-lolevel ) (define (warn port message . specialising-msgs) (print-error-message message (current-output-port) "Warning") (print (string-concatenate (map ->string specialising-msgs)))) (define (cerr . args) (for-each (lambda (x) (if (procedure? x) (x (current-error-port)) (display x (current-error-port)))) args)) (define (stx:error . messages) (cerr nl "STX: ") (apply cerr messages) (cerr nl) (exit -1)) ;; obtain all non-attribute children of a node (define (sxml:kids node) ((select-kids (lambda (x) (not (eq? (car x) '@)))) node)) ;; obtain all children of a node named n (define (sxml:kidsn name node) ((select-kids (lambda (x) (eq? (car x) name))) node)) ;; obtain child named n of a node (define (sxml:kidn name node) ((select-first-kid (lambda (x) (eq? (car x) name))) node)) ;; obtain non-empty child named n of a node (define (sxml:kidn* name node) ((select-first-kid (lambda (x) (and (eq? (car x) name) (not (null? (cdr x)))))) node)) ;; obtain the cdr of child named n (define (sxml:kidn-cdr name node) (let ((v ((select-first-kid (lambda (x) (eq? (car x) name))) node))) (if (not v) (error 'sxml:kidn-cdr "node does not have children" node) (cdr v)))) ;; obtain the cadr of child named n (define (sxml:kidn-cadr name node) (let ((v ((select-first-kid (lambda (x) (eq? (car x) name))) node))) (if (not v) (error 'sxml:kidn-cadr "node does not have children" node) (cadr v)))) (define null-template `(*default* ,(lambda (node bindings root env) (begin (warn "Unrecognized input element:" node) '())))) (define-syntax sxml:make-null-ss (syntax-rules () ((stx rule ...) (list ; default handler null-template ; handler for textual nodes (list '*text* (lambda (text) text)) rule ...)))) (define identity-template `(*default* ,(lambda (node bindings root env) (begin node)))) (define-syntax sxml:make-ss (syntax-rules () ((stx rule ...) (list identity-template (list '*text* (lambda (text) text)) rule ...)) )) ;------------------------------------------------------------------------------ ; These macros provide support for abbreviated stylesheets: ; ; ::= (stx:stylesheet