[jbr] 2011-06-06 Here is a little code to match and output translations of xml data using a notation not dissimilar to [XSLT]. You'll need [TAX Revisited] and fixes from [TAX: A Tiny API for XML]. ====== proc ::tax::xslt-proc { templates tag type props body path } { set xpath [join [list {*}[lrange $path 1 end] $tag] /] switch $type { O { array unset ::tax::xslt $xpath* set ::tax::xslt($xpath) $body } C { foreach { match template } $templates { if { $match eq $xpath } { puts -nonewline [subst $template] } } } } } proc ::tax::xslt-get { xpath } { if { [info exists ::tax::xslt($xpath)] } { return $::tax::xslt($xpath) } return } proc ::tax::xslt { templates xml } { foreach { match template } $templates { lappend temp $match \ [regsub -all {@(([a-zA-Z][a-zA-Z0-9]*/)*[a-zA-Z][a-zA-Z0-9]*)} $template {[::tax::xslt-get \1]}] } ::tax::parse [tax::new [list [list ::tax::xslt-proc $temp]]] $xml start } ====== Here is an example. Nodes named "projects/project" are matched and the template is [subst]'ed and [puts]'ed for each matching node. ====== set templates { projects/project { @projects/project/id \n} } tax::xslt $templates [read [open projects.xml]] ======