How to get the last item from an XML node
Hi struggling again: Shouldn't the code below give me the last element under <tbody>? Right now \xmlfilter{#1}{/tr/last()/command(xml:table:tbody:tr)} gives me nothing... (Use case is that I want to have a frame above the table and one bar below. So I think I should wrap the last line in the \startxtablefoot ...\stopxtablefoot, i.e., I need one command for the last element, and one for the rest (Or is there a better way?). What would be the everything but the last? What am I missing? Thanks again, Denis ================== \setupxtable[frame=off,split=yes] \setupxtable[head][topframe=on,bottomframe=on] \setupxtable[body][] \setupxtable[foot][bottomframe=on] \startbuffer[test] <?xml version="1.0" encoding="utf-8" ?> <article> <table> <tbody> <tr> <td>5</td> <td>A</td> </tr> <tr> <td>7</td> <td>B</td> </tr> <tr> <td>2</td> <td>C</td> </tr> </tbody> </table> </article> \stopbuffer \startxmlsetups xml:test \xmlsetsetup{#1}{*}{-} \xmlsetsetup{#1}{article}{xml:*} \xmlsetsetup{#1}{table}{xml:table} \stopxmlsetups \xmlregistersetup{xml:test} \startxmlsetups xml:article \starttext \xmlflush{#1} \stoptext \stopxmlsetups \startxmlsetups xml:table \startembeddedxtable \xmlfilter{#1}{/tbody/command(xml:table:tbody)} \stopembeddedxtable \stopxmlsetups \startxmlsetups xml:table:tbody \xmlfilter{#1}{/tr/last()/command(xml:table:tbody:tr)} \stopxmlsetups \startxmlsetups xml:table:tbody:tr \startxrow \xmlfilter{#1}{/td/command(xml:table:tbody:tr:td)} \stopxrow \stopxmlsetups \startxmlsetups xml:table:tbody:tr:td \startxcell \xmlflush{#1} \stopxcell \stopxmlsetups \xmlprocessbuffer{test}{test}{} ==================
On 21 Sep 2020, at 18:31, Denis Maier
wrote: Hi
struggling again: Shouldn't the code below give me the last element under <tbody>? Right now \xmlfilter{#1}{/tr/last()/command(xml:table:tbody:tr)} gives me nothing...
(Use case is that I want to have a frame above the table and one bar below. So I think I should wrap the last line in the \startxtablefoot ...\stopxtablefoot, i.e., I need one command for the last element, and one for the rest (Or is there a better way?). What would be the everything but the last?
What am I missing?
You need to read some more on the "Expressions and filters” chapter of the xml manual, as it does not work quite the way you think. Here is a quick fix:
\startxmlsetups xml:table:tbody \xmlfilter{#1}{/tr/last()/command(xml:table:tbody:tr)}
\xmlfilter{#1}{/tr[position()==last()]/command(xml:table:tbody:tr)} Best wishes, Taco
Am 22.09.2020 um 09:18 schrieb Taco Hoekwater:
On 21 Sep 2020, at 18:31, Denis Maier
wrote: Hi
struggling again: Shouldn't the code below give me the last element under <tbody>? Right now \xmlfilter{#1}{/tr/last()/command(xml:table:tbody:tr)} gives me nothing...
(Use case is that I want to have a frame above the table and one bar below. So I think I should wrap the last line in the \startxtablefoot ...\stopxtablefoot, i.e., I need one command for the last element, and one for the rest (Or is there a better way?). What would be the everything but the last?
What am I missing?
You need to read some more on the "Expressions and filters” chapter of the xml manual, as it does not work quite the way you think. Here is a quick fix:
\startxmlsetups xml:table:tbody \xmlfilter{#1}{/tr/last()/command(xml:table:tbody:tr)}
\xmlfilter{#1}{/tr[position()==last()]/command(xml:table:tbody:tr)}
Best wishes, Taco
Thanks! That works. I have to admit, it's not entirely clear to me. I adapted my pattern from the one given on page 78: /whocares/last() Obviously, it's not that easy. Best, Denis
participants (2)
-
Denis Maier
-
Taco Hoekwater