Subject: Re: [xsl] Help With Homework: HTML Tables to CALS From: "David Birnbaum djbpitt@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Thu, 23 Jan 2020 17:42:32 -0000 |
Dear Martin and Michael, Thank you both for the quick responses! Best, David On Thu, Jan 23, 2020 at 12:38 PM Michael Kay mike@xxxxxxxxxxxx < xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > In Saxon there's the vendor extension <xsl:function > saxon:memo-function="yes"/> which has been available for some years; in > XSLT 3.0 it's standardised as <xsl:function cache="yes"/> > > Michael Kay > Saxonica > > On 23 Jan 2020, at 17:31, David Birnbaum djbpitt@xxxxxxxxx < > xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > > Dear XSL-list, > > Is there information anywhere about how to construct a memo function? I > see that support for it it is built into Saxon PE and EE, but does anyone > know of an example or description of how to construct a memo function in > HE, or a different XSLT engine that does already incorporate hooks for that > functionality? > > Thanks, > > David > > On Thu, Jan 23, 2020 at 11:15 AM Michael Kay mike@xxxxxxxxxxxx < > xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > >> One technique I have found useful in converting algorithms designed for >> procedural programming languages is to use memo functions. For example, if >> you need to assign (row, column, height, depth) properties to every cell >> in a table, you don't necessarily need to construct a data structure >> holding that information; if you have a function (or set of functions) that >> computes the properties in terms of the corresponding properties for other >> cells in the table, and if you make that computation a memo function, then >> the data structure is there in the implicit memory of the memo function, >> and doesn't need to be exposed explicitly in variables. To take an example >> with a one-dimensional table where every cell has a colspan attribute, we >> can compute >> >> function f:column($cell) { $cell ! (if (preceding-sibling::cell) then >> (column(preceding-sibling::cell) + (@colspan, 1)[1]) else 1) } >> >> and if this is a memo function, we don't need to worry about the cost of >> repeated computation of the function. >> >> Michael Kay >> Saxonica >> >> On 23 Jan 2020, at 15:59, Eliot Kimber ekimber@xxxxxxxxxxxx < >> xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: >> >> Andrew's code will almost certainly allow me to solve my immediate >> problem. >> >> I would still be interested in an XSLT 3 solution that uses arrays or >> maps, but I might be able to work it out myself, although I know that I >> don't fully grok the best/most compact way to do things, for example, >> taking advantage of higher-order functions or fold-* approaches. >> >> Cheers, >> >> E. >> -- >> Eliot Kimber >> http://contrext.com >> >> >> o;?On 1/23/20, 9:37 AM, "Martin Honnen martin.honnen@xxxxxx" < >> xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: >> >> Am 23.01.2020 um 16:30 schrieb Eliot Kimber ekimber@xxxxxxxxxxxx: >> >> I have XSLT 1-style code that converts HTML tables to CALS tables. I >> discovered that this code fails for certain patterns of HTML tables in that >> it miscalculates column spans in the face of row spans earlier in the >> table. It doesn't fail for all tables, just specific ones (which is why we >> didn't notice this bug earlier). I haven't been able to determine the cause >> of the bug in the short time I've had to debug it (found the bug in the >> course of trying to prepare a rush publishing job that has about 50 complex >> tables in it, of course). >> >> Rather than try to debug and fix the XSLT 1 solution it seemed easier and >> better to re-implement the processing using XSLT 3 and I took a stab at >> doing it using arrays last night, but quickly got bogged down in my own >> lack of facility with such things. The procedural solution in i.e., Java, >> would be easy: just populate the 2x2 matrix that represents the table grid >> to reflect row and column spans as you process the table cells >> left-to-right and top to bottom, using cells projected from earlier rows to >> determine the starting column of cells in subsequent rows that get pushed >> over by row-spanning cells. >> >> However, I couldn't quickly see how to do this using arrays or maps in >> XSLT 3--the immutability of arrays and thus the coding patterns that take >> existing arrays or maps and return new ones threw me and my feeble brain >> just wasn't landing on the right algorithmic pattern. >> >> I know there must be a general pattern for this type of processing but >> none of the examples I could find were helpful. >> >> So my request: can someone help me with this challenge and outline how to >> solve this kind of problem where you take as input an HTML table where any >> cell may span two or more columns and two or more rows and produce a 2x2 >> array representing the table's grid, where every grid cell reflects the >> HTML table cell that covers it. >> >> From that array it's then easy to determine what the CALS result should >> be (where CALS represents column spans by naming the start and end columns >> the cell spans). >> >> >> Does Andrew's XSLT 2 code help? >> http://andrewjwelch.com/code/xslt/table/table-normalization.html >> >> >> >> >> >> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> >> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/3318727> (by >> email) >> > XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> > EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/293509> (by > email) > > > XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> > EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/3318727> (by > email <>)
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Help With Homework: HTML , Michael Kay mike@xxx | Thread | Re: [xsl] Help With Homework: HTML , John Lumley john@xxx |
Re: [xsl] Help With Homework: HTML , Michael Kay mike@xxx | Date | Re: [xsl] Help With Homework: HTML , Eliot Kimber ekimber |
Month |