is it possible to use the <xsl:key> function on a node-set
returned by the
ext:node-set() function ?
Assuming that the vendor's implementation of ext:node-set() is reasonably
conformant, yes. The key() function is defined to work on the tree
containing the context node, which can be any tree, including one created
using ext:node-set().
Michael Kay
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[(_at_)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
--+------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--+--