%D \module %D [ file=xtag-xsl, %D version=2002.03.07, %D title=\CONTEXT\ XML Support, %D subtitle=XSLT processing, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] %C %C This module is part of the \CONTEXT\ macro||package and is %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. % FOR THIS TO WORK YOU NEED A PROPER cp8bit VECTOR % % 8 bit support has been messed up in a couple of distributions % % 0x00 0x00 % 0x01 0x01 % 0x02 0x02 % etc %D This module is rather experimental so users may expect %D changes in the interface. \unprotect \definesystemvariable {xl} \newif\iftraceXSLTprocessing % \traceXSLTprocessingtrue \def\XSLTscriptfile{\bufferprefix xlscript} % to be sped up: \def\presetXSLTcharacters {\let\par\empty \def\{{\rawcharacter{`\{}}% \string^^.. \def\}{\rawcharacter{`\}}}% \string^^.. \def\\{\rawcharacter{`\\}}}% \string^^.. \def\obeyXSLTcharacters {\setnaturalcatcodes \catcode`\\=\escapecatcode} \long\def\startXSLTscript #1 #2 % {\bgroup \obeyXSLTcharacters \doifelse{#2}{capsule}\dostartXSLTscript\nostartXSLTscript#1 #2 } \long\def\dostartXSLTscript#1 #2 #3 % {\obeylines \dodostartXSLTscript#1 #2 #3 } \long\def\dodostartXSLTscript#1 #2 #3 #4\stopXSLTscript {\egroup \long\setvalue{\??xl#1}{\doXSLTscript{#3}{#4}}} \long\def\nostartXSLTscript {\obeylines \nonostartXSLTscript} \long\def\nonostartXSLTscript#1 #2\stopXSLTscript {\egroup \long\setvalue{\??xl#1}{\doXSLTscript\empty{#2}}} \long\def\donormalXSLTscript#1#2% {\includeXSLTscript{b-capsule-#1}% #2% \includeXSLTscript{e-capsule-#1}} \def\includeXSLTscript#1% {\csname\ifcsname\??xl#1\endcsname\??xl#1\else\s!empty\fi\endcsname} \startXSLTscript b-capsule-1.0 \stopXSLTscript \startXSLTscript e-capsule-1.0 \stopXSLTscript \def\applyXSLTscript {\dotripleempty\doapplyXSLTscript} \long\def\doapplyXSLTscript[#1][#2][#3]% {\ifthirdargument \bgroup \let\doXSLTscript\donormalXSLTscript \presetXSLTcharacters \donefalse \def\docommand##1{\dodoapplyXSLTscript{##1}{\ifdone#3\else#2\fi}{#3}\donetrue}% \processcommalist[#1]\docommand \egroup \else \applyXSLTscript[#1][#2][#2]% \fi} % Since a \XML\ file is loaded into memory as a tree, we % can safely use the same input and output filename, thereby % avoiding temporary files. \def\dodoapplyXSLTscript#1#2#3% {\bgroup \doifundefined{\??xl#1}% {\writestatus{XSLT}{unknown script #1}} {\writestatus{XSLT}{convert #2 into #3 using #1}% \edef\par{\outputnewlinechar}% \edef\!!stringc{\getvalue{\??xl#1}}% \immediate\openout\scratchwrite=\XSLTscriptfile.xsl \immediate\write\scratchwrite{\!!stringc}% \immediate\closeout\scratchwrite \iftraceXSLTprocessing\wait\fi \executeXSLT{\XSLTscriptfile.xsl}{#2}{#3}% \iftraceXSLTprocessing\wait\fi}% \egroup} \def\executeXSLT#1#2#3% script input output {\executesystemcommand{xsltproc -o #3 #1 #2}} \long\def\applyXSLTtobuffer {\dodoubleempty\doapplyXSLTtobuffer} \long\def\doapplyXSLTtobuffer[#1][#2]% {\expanded{\applyXSLTscript[#1][\TEXbufferfile{\ifsecondargument#2\else\jobname\fi}]}} \def\resetXSLTscripting#1% {\setgvalue{\??xl\s!dummy}{\doXSLTscript{#1}{}}} \resetXSLTscripting{1.0} \def\startXSLTscripting {\bgroup \obeyXSLTcharacters \obeylines \dostartXSLTscripting} \long\def\dostartXSLTscripting#1\stopXSLTscripting {\egroup \let\doXSLTscript\doextendXSLTscript \getvalue{\??xl\s!dummy}{#1}} \long\def\doextendXSLTscript#1#2#3% {\setgvalue{\??xl\s!dummy}{\doXSLTscript{#1}{#2#3}}} \def\applyXSLTscripting {\applyXSLTscript[\s!dummy]} \protect \doifnotmode{demo}{\endinput} % \def\Whow{Whow It Works} % % \startXSLTscript test capsule 1.0 % % % % \Whow \\ # % % % % % % \stopXSLTscript % % \applyXSLTscript [test] [figtest.xml] [crap.tmp] \typefile{crap.tmp} % % \startbuffer % world % \stopbuffer % % \applyXSLTtobuffer[test] \typebuffer % % \startXSLTscripting % % \stopXSLTscripting % % \startXSLTscripting % % % % \stopXSLTscripting % % \startXSLTscripting % % % % \stopXSLTscripting % % \applyXSLTscripting [figtest.xml] [crap.tmp] \typefile{crap.tmp} \starttext \startXSLTscript another name: \\par \stopXSLTscript \applyXSLTscript [another] [cont-en.xml] [whatever.tmp] \readfile{whatever.tmp}{}{} \stoptext