XML: calculations on attribute values before output
Hi. I'm processing an XML table and need to set a row span. Because we use a variant of the CALS table model, spans are defined by an attribute saying how many *additional* rows should be spanned, as opposed to how many *in total*. So to translate this into TABLE \bTD[nr=X] syntax I need to add 1. I'm guessing this is very easily doable (in lua?) but I've tried various permutations and can't work it out. If anyone could give me a pointer that would be great. (In reality I'm going to need to handle lots of other conversions of attribute values into \bTD[...] commands, so if there's a generalised way of doing that sort of thing, or even better if someone has already tackled CALS tables in this way, that would also be great!) MWE below, but obviously it just passes the morerows="1" value straight through into \bTD[nr=1] so it doesn't give me a row span at all. Thanks in advance. Duncan ------ \startbuffer[demo] <informaltable> <tgroup> <tbody> <row> <entry morerows="1">1</entry> <entry>2</entry> </row> <row> <entry>3</entry> </row> </tbody> </tgroup> </informaltable> \stopbuffer \startxmlsetups xml:demo:base \xmlsetsetup{#1}{*}{xml:demo:*} \stopxmlsetups \xmlregisterdocumentsetup{demo}{xml:demo:base} \startxmlsetups xml:demo:informaltable \bTABLE \xmlflush{#1} \eTABLE \stopxmlsetups \startxmlsetups xml:demo:tgroup \xmlflush{#1} \stopxmlsetups \startxmlsetups xml:demo:tbody \xmlflush{#1} \stopxmlsetups \startxmlsetups xml:demo:row \bTR \xmlflush{#1} \eTR \stopxmlsetups \startxmlsetups xml:demo:entry \bTD[nr=\xmlattdef{#1}{morerows}{1}] \xmlflush{#1} \eTD \stopxmlsetups \setupbodyfont[modern] \starttext \xmlprocessbuffer{demo}{demo}{} \stoptext ------
On 4 May 2022, at 22:10, Duncan Hothersall via ntg-context
wrote: Hi.
I'm processing an XML table and need to set a row span. Because we use a variant of the CALS table model, spans are defined by an attribute saying how many *additional* rows should be spanned, as opposed to how many *in total*. So to translate this into TABLE \bTD[nr=X] syntax I need to add 1.
I'm guessing this is very easily doable (in lua?) but I've tried various permutations and can't work it out. If anyone could give me a pointer that would be great.
(In reality I'm going to need to handle lots of other conversions of attribute values into \bTD[...] commands, so if there's a generalised way of doing that sort of thing, or even better if someone has already tackled CALS tables in this way, that would also be great!)
Not CALS, but I do a lot of HTML table processing. I find it all much easier on the lua side, because there the attributes are just in a table entry of the argument node t ( t.at ): set up a lua function in the setups: \startxmlsetups xml:demo:base \xmlsetsetup{#1}{*}{xml:demo:*} \xmlsetfunction {\xmldocument}{entry}{userdata.xmlfunctions.entry} \stopxmlsetups and then add this lua code: \startluacode userdata.xmlfunctions = {} function userdata.xmlfunctions.entry (t) local rows = (t.at.morerows or 1) + 1 context.bTD({nr=rows}) lxml.flush(t) context.eTD() end \stopluacode All of the tex-side commands also exist in lua, in the lxml and/or xml table, e.g.: direct output flushing: lxml.flush(t) lxml.all(t, ‘entry’) filter for processing: for b in xml.collected(lxml.getid(t),'../row/entry') do … end (those are the ones I use a lot, there are many more) Best wishes, Taco
Thanks so much Taco, that opens the door to a lot for me. It's a tricky
learning curve.
Just in case anyone else is copying code in future for CALS, there's a tiny
tweak to the rows calculation, it should be (t.at.morerows or 0) + 1.
I see a route to solving lots of other problems here too. Thanks again.
Duncan
On Thu, 5 May 2022 at 08:21, Taco Hoekwater
On 4 May 2022, at 22:10, Duncan Hothersall via ntg-context < ntg-context@ntg.nl> wrote:
Hi.
I'm processing an XML table and need to set a row span. Because we use a variant of the CALS table model, spans are defined by an attribute saying how many *additional* rows should be spanned, as opposed to how many *in total*. So to translate this into TABLE \bTD[nr=X] syntax I need to add 1.
I'm guessing this is very easily doable (in lua?) but I've tried various permutations and can't work it out. If anyone could give me a pointer that would be great.
(In reality I'm going to need to handle lots of other conversions of attribute values into \bTD[...] commands, so if there's a generalised way of doing that sort of thing, or even better if someone has already tackled CALS tables in this way, that would also be great!)
Not CALS, but I do a lot of HTML table processing. I find it all much easier on the lua side, because there the attributes are just in a table entry of the argument node t ( t.at ):
set up a lua function in the setups:
\startxmlsetups xml:demo:base \xmlsetsetup{#1}{*}{xml:demo:*} \xmlsetfunction {\xmldocument}{entry}{userdata.xmlfunctions.entry} \stopxmlsetups
and then add this lua code:
\startluacode userdata.xmlfunctions = {} function userdata.xmlfunctions.entry (t) local rows = (t.at.morerows or 1) + 1 context.bTD({nr=rows}) lxml.flush(t) context.eTD() end \stopluacode
All of the tex-side commands also exist in lua, in the lxml and/or xml table, e.g.:
direct output flushing: lxml.flush(t) lxml.all(t, ‘entry’)
filter for processing: for b in xml.collected(lxml.getid(t),'../row/entry') do … end
(those are the ones I use a lot, there are many more)
Best wishes, Taco
-- Duncan Hothersall, Operations Director CAPDM Limited - Online Program Enablers 0131 677 2400 www.capdm.com Registered in Scotland: SC168970 VAT: 682 846 983 Registered address: 20 Forth Street Edinburgh EH1 3LH UK https://maps.google.com/?q=22+Forth+Street,+Edinburgh,+EH1+3LH,+UK&entry=gmail&source=g Capture, author, publish, deliver and manage your learning materials. *Sign up to the CAPDM newsletter here http://eepurl.com/bqzBQn*
participants (2)
-
Duncan Hothersall
-
Taco Hoekwater