Hello all,
is it possible to use the <xsl:key> function on a node-set returned by the
ext:node-set() function ?
What I am performing is the following:
- I combine two xml files to one (by means of the document() function)
- this temporary xml file is transformed into a node-set by means of the
node-set() extension function
Now on this temporary file I want to perform grouping. I am using the axis
preceding-sibling (a number of times) which produces the correct output. But
this is causing big performance problems. For an xml source of about 1MB it
already takes a very long time (more than half a hour !). I know that the
xsl:key is a faster way, but I don't think I can use that for a temp tree,
can I ?
Temp tree:
<extended_root>
<object name="object1" timestamp="15:00:00" instance="0" package="pack1"
value="1"/>
<object name="object2" timestamp="15:00:00" instance="0" package="pack2"
value="1"/>
<object name="object3" timestamp="15:00:00" instance="0" package="pack1"
value="3"/>
<object name="object1" timestamp="15:00:00" instance="1" package="pack1"
value="4"/>
<object name="object1" timestamp="15:30:00" instance="0" package="pack1"
value="1"/>
<object name="object2" timestamp="15:30:00" instance="0" package="pack2"
value="1"/>
<object name="object3" timestamp="15:30:00" instance="0" package="pack1"
value="4"/>
<object name="object1" timestamp="15:30:00" instance="1" package="pack1"
value="3"/>
</extended_root>
Pro package I need one header with an enumeration of all objects for this
package:
HEADER;pack1;object1;object3;object4
Under each header a grouping is needed pro timestamp and pro instance. All
values for that belongs to this grouping are added to the entry
HEADER;pack1;object1;object3
pack1;;SCANNER;15:00:00;Instance0;1,3
pack1;;SCANNER;15:00:00;Instance1;4,-1
pack1;;SCANNER;15:30:00;Instance0;1,4
pack1;;SCANNER;15:30:00;Instance1;3,-1
HEADER;pack2;object2
pack2;;SCANNER;15:00:00;Instance0;1
pack2;;SCANNER;15:30:00;Instance1;1
To achieve this I have following template:
<xsl:template match="extended_root">
<xsl:for-each select="object">
<xsl:variable name="currentPackage" select="@package"/>
<xsl:variable name="currentInstance" select="@instance"/>
<xsl:variable name="currentDateTime" select="@timestamp"/>
<xsl:if test="not(preceding-sibling::object[@package=$currentPackage])">
<xsl:call-template name="write_header">
<xsl:with-param name="counterList"
select="/extended_root/object[(@package=$currentPackage) and
(not(@name=preceding-sibling::object/@name))]/@name"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="(not(preceding-sibling::object[(@package=$currentPackage)
and (@instance=$currentInstance) and (@timestamp=$currentDateTime)]))">
<xsl:call-template name="write_datarecord">
<xsl:with-param name="counterList"
select="/extended_root/object[(@package=$currentPackage) and
(not(@name=preceding-sibling::object/@name))]/@name"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</xsl:template>
Writing the header is performed in an acceptable amount of time, but writing
the records gives a lot of problems.
Does anybody has some suggestions how I could improve performance.
Thanks !
Kind regards,
ismael