Subject: RE: Identical entries in different input documents should appear in the output document only once
From: "Meyer, Roland 1. (NSN - DE/Germany - MiniMD)" <roland.1.meyer@xxxxxxx>
Date: Fri, 7 Sep 2007 21:38:57 +0200
|
Hi,
thanks for your answers, Mike and Ken. I am using XSLT 2.0 anyway, but never
used the grouping till now. What I just read about it sounds promising ...
Best Regards / Mit freundlichen Gr|_en,
Roland
-----Original Message-----
From: ext G. Ken Holman [mailto:gkholman@xxxxxxxxxxxxxxxxxxxx]
Sent: Friday, September 07, 2007 6:59 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: Identical entries in different input documents should
appear in the output document only once
At 2007-09-07 17:54 +0200, Meyer, Roland 1. (NSN - DE/Germany - MiniMD)
wrote:
>I have the following problem. I have a couple of XML documents to merge
>to one output document.
>Each document has the same structure like this:
>
><root>
> <block>
> <oneTag>some value<oneTag>
> <anotherTag>another value<anotherTag>
> ...
> <idTag>setId-itemId<idTag>
> </block>
> <block>
> ...
> </block>
> ...
></root>
>
>I have to interpret the value in the idTag (the setId-itemId) as an
>identifier for the complete structure between the block tags.
>Within one document this identifying value comes only once, but the same
>identifying value can be found in different documents.
>
>What I now need:
>My output file should list each block only ones, means although the same
>identifying value is present in different input documents, it should
>appear only once in the output document.
>
>I can think about some heavy procedures by checking every found
>identifier value in the already processed files (because then they are
>already written to the output), but this will be very time consuming (I
>have around 15 files with each up to 10000 blocks).
>
>Is there any other and simpler way to - let's say - memorize the already
>written blocks resp. identifiers?
Mike is correct that the variable-based grouping method would work
with this, but it is far slower than an XSLT 2 approach. When using
XSLT 1.0 I find variable-based grouping acceptable for sub-document
and multi-document grouping.
The code would work along the lines of the following, and it assumes
that there is an XML structure $files with the list of all the file names:
<xsl:variable name="items"
select="document($files/file/@uri,.)/root/block"/>
<xsl:for-each select="$items">
<!--walk through all, doing work at first of each unique idTag-->
<xsl:if test="generate-id(.)=
generate-id($items[idTag=current()/idTag])">
<!--the following executes once for each unique idTag
value across all the files-->
</xsl:if>
</xsl:for-each>
I hope this helps.
. . . . . . . . . . . . . Ken
--
Upcoming public training: XSLT/XSL-FO Sep 10, UBL/code lists Oct 1
World-wide corporate, govt. & user group XML, XSL and UBL training
RSS feeds: publicly-available developer resources and training
G. Ken Holman mailto:gkholman@xxxxxxxxxxxxxxxxxxxx
Crane Softwrights Ltd. http://www.CraneSoftwrights.com/s/
Box 266, Kars, Ontario CANADA K0A-2E0 +1(613)489-0999 (F:-0995)
Male Cancer Awareness Jul'07 http://www.CraneSoftwrights.com/s/bc
Legal business disclaimers: http://www.CraneSoftwrights.com/legal
|