Subject: Re: [xsl] improving performance in creating ids|
From: "Pieter Lamers pieter.lamers@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Tue, 23 Apr 2019 14:28:32 -0000
On 23.04.2019 14:07, Pieter Lamers pieter.lamers@xxxxxxxxxxxx wrote:Hi All,
I need generated-ids on elements in a BITS file that have @rids, so I can link back to them. I cannot use generate-id(), because I need it to produce the same id in both the xquery (eXist) context and in the XSL (saxon) contect.
I have created a function that will generate a human readable id based on the id of the nearest ancestor/@id and then element-name + sequence number. It produces the output that I like, but at the cost of a poor performance (when run on a whole book) . now with the preceding/ancestor juggling that I do there might be a better way than mine, so my question is if there is a better way to tackle this problem.
declare function local:get-id-in-doc ( $target as element() ) as xs:string
B B let $current-element as xs:string := local-name($target)
B B let $ancestor-with-id as element()? := $target/ancestor::*[@id]
B B let $prefix as xs:string? := $ancestor-with-id/@id/string()
B B let $count := B B B B if($prefix) then B B B B B B (: case 1: there is an ancestor with an @id :) B B B B B B count($target/preceding::*[local-name() eq $current-element][ancestor::* = $ancestor-with-id]) + 1
That general value comparison
B ancestor::* = $ancestor-with-id
looks odd, shouldn't that be
B ancestor::*[. is $ancestor-with-id]
? I would expect node identity comparison and not value comparison.
Whether that improves performance and then also on two different implementations is something I can't tell without testing.
2. Is there an alternative way of generating ids (possibly having less
human-readable values) that would work in both the xquery and xslt realm?
It looks like a job for XSLT's xsl:number and I wonder whether your database xquery processor doesn't provide a way to simply run an XSLT transformation.
-- Pieter Lamers John Benjamins Publishing Company Postal Address: P.O. Box 36224, 1020 ME AMSTERDAM, The Netherlands Visiting Address: Klaprozenweg 75G, 1033 NN AMSTERDAM, The Netherlands Warehouse: Kelvinstraat 11-13, 1446 TK PURMEREND, The Netherlands tel: +31 20 630 4747 web: www.benjamins.com
|<- Previous||Index||Next ->|
|Re: [xsl] improving performance in , Dave Pawson dave.paw||Thread||Re: [xsl] improving performance in , Michael Kay mike@xxx|
|Re: [xsl] improving performance in , Dave Pawson dave.paw||Date||Re: [xsl] Dynamically determining l, Eliot Kimber ekimber|