#! /bin/sh string=? ; exec mzscheme -M errortrace -gr $0 $* ; XSLT-like transformation of an XML document. ; The elements matching "/table/element[state/@condition='standard']" ; are selected and transformed to ; (following (@ (for "ELEMENT-NAME")) ; (element ...) ; (element ...) ; ) ; where only elements with greater value of "atomic_number" attribute ; are included. (require (lib "common.ss" "sxml") (lib "myenv.ss" "ssax") (lib "ssax.ss" "ssax") (lib "parse-error.ss" "ssax") (lib "sxml-tools.ss" "sxml") (lib "sxpath.ss" "sxml") (lib "stx-engine.ss" "sxml") ) ; "Raw" stylesheet, see "sxml:stylesheet" for some syntactic sugar. (define sst `((*default* ,(lambda (node bindings root environment) (stx:apply-templates (sxml:content node) bindings root environment) )) (*text* ,(lambda(x) x)) (,(sxpath "/table/element[state/@condition='standard']") ,(lambda (current-node stx:templates current-root $) `(following (@ (for ,(sxml:attr current-node 'name))) ,@(filter (lambda(elt) (if (> (sxml:num-attr elt 'atomic_number) (sxml:num-attr current-node 'atomic_number)) elt #f)) ((sxpath `(// element)) current-root))) )))) (let ((doc (sxml:add-parents (ssax:xml->sxml (open-input-file "ex.xml") '())))) (pp (stx:apply-templates doc sst doc '())) ) (exit)