Hi all --

So in Open Document Spreadsheets, columns with empty cells may be collapsed:

<table:table-row table:style-name="ro2">
     <table:table-cell table:number-columns-repeated="3"
table:style-name="ce454" />
     <table:table-cell table:style-name="ce255" />
     <table:table-cell table:style-name="ce255" office:value-type="string">
      <text:p>label</text:p>
     </table:table-cell>
     <table:table-cell table:style-name="ce255" office:value-type="string">
      <text:p>description</text:p>
     </table:table-cell>
     <table:table-cell table:number-columns-repeated="4"
table:style-name="ce455" />
    </table:table-row>

Not all of the rows have have these collapsed empty cells; in some rows,
all the cells are present because they've got values in them.  And while I
wouldn't care in the example row, sometimes more than one table:table-cell
represents a collapsed column in a position I care about.

All the labels are in column D and all the descriptions in column E (in
spreadsheet terms), whether all the table:cell elements are present in the
XML representation of the sheet or not, and I need to reliably find them so
as to be able to convince myself that the XSLT transform is getting correct
answers.  (The spreadsheet is about 40 MiB; not so much by recent list
standards, but still more than I can hope to read. :)

declare function local:realPos($current as node())
as xs:integer
{
 (: the horror, the horror :)
 xs:integer(path($current) ! tokenize(.,'/')[last()] !
replace(.,'.*\[(\p{Nd}+)\]','$1') ! xs:integer(
.)
  +
sum($current/preceding-sibling::table:table-cell/@table:number-columns-repeated)
  -
count($current/preceding-sibling::table:table-cell/@table:number-columns-repeated)
)
};

works, in the sense of "will get the cell corresponding to the intended
spreadsheet column even when some of the columns have been collapsed with
@table:number-columns-repeated".

It's horribly slow and it hurts just to look at, though, so -- is there a
better way?

(The XSLT transform pre-processes all the collapsed table:table-cell
elements back into place, among other tidying.  I'm not at all sure that's
a better way with XQuery.)

Thanks!
Graydon

Reply via email to