[xquery-talk] solutions to an Excel XML processing problem
John Snelson
jsnelson at sleepycat.com
Thu Aug 24 02:07:21 PDT 2006
Something like this seems to do the job:
declare function local:expand($column as xs:integer, $max as xs:integer,
$input as element()?) as element()*
{
if($input) then
if($input/@i) then (
for $i in ($column to xs:integer($input/@i) - 1) return <c/>,
<c>{ $input/node() }</c>,
local:expand(xs:integer($input/@i) + 1, $max,
$input/following-sibling::c[1])
)
else (
$input,
local:expand($column + 1, $max, $input/following-sibling::c[1])
)
else for $i in ($column to $max) return <c/>
};
let $in := <row cnt="30">
<c i="3">third</c>
<c>fouth</c>
<c>fifth</c>
<c i="10">tenth</c>
<c>eleventh</c>
<c i="20">twentieth</c>
<c>twenty-one</c>
<c>twenty-two</c>
<c>twenty-three</c>
</row>
return
local:expand(1, xs:integer($in/@cnt), $in/c[1])
John
Daniela Florescu wrote:
> Dear all,
>
> I am trying to find various solutions to the following XML to XML
> transformation problem.
> It is taken out of real world Excel spreadsheets data processing.
>
> (Input) The data is composed of cells and some of the cells are empty
> (no content).
> This version of the data is in compressed form, i.e. does not contain
> the empty cells and is using the
> attribute @i to express jumps to the next non empty cell (using the
> position). It looks like this:
> =====================================================================
>
>
> <row cnt="30">
> <c i="3">third</c>
> <c>fouth</c>
> <c>fifth</c>
> <c i="10">tenth</c>
> <c>eleventh</c>
> <c i="20">twentieth</c>
> <c>twenty-one</c>
> <c>twenty-two</c>
> <c>twenty-three</c>
> </row>
>
>
> (Ouput) Write an XQuery to transform the XML data in the uncompressed form
> that includes the empty cells, as follows:
> =============================================================
>
> <row cnt="30">
> <c/>
> <c/>
> <c>third</c>
> <c>fouth</c>
> <c>fifth</c>
> <c/>
> <c/>
> <c/>
> <c/>
> <c>tenth</c>
> <c>eleventh</c>
> <c/>
> <c/>
> <c/>
> <c/>
> <c/>
> <c/>
> <c/>
> <c/>
> <c i="20">twentieth</c>
> <c>twenty-one</c>
> <c>twenty-two</c>
> <c>twenty-three</c>
> ...
> </row>
>
>
> I know it can be done in a variety of ways, I am just looking for the
> "best" (i.e. simplest) XQuery
> to achieve this purpose that people on this list can help me find.
>
> Thanks in advance,
> Dana
>
> _______________________________________________
> talk at xquery.com
> http://xquery.com/mailman/listinfo/talk
More information about the talk
mailing list