|
Subject: RE: [xsl] How do can I select distinct nodes and adding a counter at the sa me time From: TSchutzerWeissmann@xxxxxxxxxxxxxxxx Date: Wed, 27 Nov 2002 16:30:36 -0000 |
Hello Cams,
You'll have to exclude any nodes that already occur in the first file:
This concatenates the text value and the xxxx/@att value and sees if it
occurs as an @oid value in the first file.
<xsl:apply-templates
select="xxx[
(not (contains(concat(.,'||',xxxx/@*),
$first/mapping/@oid))
and
(generate-id() = generate-id(key('distinctlyXXX',
self::xxx[not(xxxx/@*)]|xxxx/@*)))
)]"/>
You'll need to change the bits relating to the first file, to reflect its
structure:
<xsl:variable name="first_path" select="'first.xml'"/>
<xsl:variable name="first" select="document($first_path)/root"/>
<xsl:variable name="first_count_maps"
select="count($first/mapping)"/>
hth
Tom
> -----Original Message-----
> From: Cams Ismael [mailto:Ismael.Cams@xxxxxxxxxxxxxxx]
> Sent: 27 November 2002 15:18
> To: 'xsl-list@xxxxxxxxxxxxxxxxxxxxxx'
> Subject: RE: [xsl] How do can I select distinct nodes and adding a
> counter at the sa me time
>
>
> Hello,
>
> I have been already helped a lot by this solution. However again I
> encountered a problem for which I don't see a solution
> immediately. What I
> need now is a mechanism to determine if the xxx value or att1
> attribute is
> already in the first xml file. When already available this
> node should not
> be count. So what I want to do is the next:
>
> first file:
>
> <root>
> <mapping oid=".1.5.3.2" id="1"/>
> <mapping oid=".1.5.3.4.5" id="3"/>
> </root>
>
> second file:
> <xx>
> <xxx>.1.5.6.3.8
> <xxxx att1=".1.5.6.3.8"/>
> <xxx>
> <xxx>.1.5.6.3.10
> <xxxx att2="1.5.3.4.5"/>
> <xxx>
> <xxx>.1.5.6.4.5</xxx>
> </xx>
>
> result file should be:
> <root>
> <mapping oid=".1.5.3.2" id="1"/>
> <mapping oid=".1.5.3.4.5" id="3"/>
> <mapping oid=".1.5.3.4.8" id="5"/>
> <mapping oid=".1.5.6.4.5" id="7"/>
> </root>
>
> The solution I have now gives the following result:
> <root>
> <mapping oid=".1.5.3.2" id="1"/>
> <mapping oid=".1.5.3.4.5" id="3"/>
> <mapping oid=".1.5.3.4.8" id="5"/>
> <mapping oid=".1.5.6.4.5" id="9"/> <!--This id should be
> 7-->
> </root>
>
> The stylesheet I use select all distinct values with use of the Muench
> method. Than I check if the value was already available in
> the first file.
> What I actually need is a selection of all distinct nodes
> that don't already
> exist in the first file. If all this information was in one
> file I think I
> could handle it, but no two files are used and I don't see directly a
> solution for this. Hopefully someone can help me with this again ?
>
> Thanks in advance.
>
> Kind regards,
> Ismaël
>
> -----Original Message-----
> From: TSchutzerWeissmann@xxxxxxxxxxxxxxxx
> [mailto:TSchutzerWeissmann@xxxxxxxxxxxxxxxx]
> Sent: vrijdag 22 november 2002 16:59
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: RE: [xsl] How do can I select distinct nodes and adding a
> counter at the sa me time
>
>
> Dear Ismaël
>
> >I know what you mean, but the problem I have is how do I
> produce a tree
> with
> >distinct values that I can access afterwards.
>
> This is essentially a grouping problem. You can use xsl:key to group
> elements according to a particular value. This will allow you
> to access the
> distinct values as a nodeset, without having to put them in a
> variable and
> use an extension function.
>
> [from your first email]
>
> > The second one looks like this:
> >
> > <xx>
> > <xxx>.1.5.6.3.8
> > <xxxx att1=".1.5.6.3.8"/>
> > <xxx>
> > <xxx>.1.5.6.3.10
> > <xxxx att2="1.5.6.3.9"/>
> > <xxx>
> > <xxx>.1.5.6.4.5</xxx>
> > </xx>
> [...]
> > What I want to do know is getting out of the second xml file the
> > values of the attributes mapped onto an odd number (5,7,9) when this
> > attribute is available. When not available the text value
> of the tag must
> be
> > used.
>
> The only hard bit is setting up the key so that it ignores
> the text value of
> the xxx tag if there's an xxxx child with an attribute.
>
> <xsl:key name="distinctlyXXX" match="xxx"
> use="self::xxx[not(xxxx/@*)]|xxxx/@*"/>
>
> <!-- group on the xxxx child's first attribute, if it exists,
> otherwise on the text value of xxx -->
>
> <xsl:variable name="first_path" select="firstFile.xml"/>
> <xsl:variable name="first" select="document($first_path)"/>
> <xsl:variable name="first_count_maps"
> select="count($first/mapping/map)"/>
>
> <xsl:template match="xx">
> <mapping>
> <xsl:copy-of select="$first/mapping/map"/>
> <xsl:apply-templates
> select="xxx[generate-id() = generate-id(key('distinctlyXXX',
> self::xxx[not(xxxx/@*)]|xxxx/@*))]"/>
> <!-- this is classic Muenchian grouping -->
> </mapping>
> </xsl:template>
>
> <xsl:template match="xxx">
> <map oid="{string(self::xxx[not(xxxx/@*)] | xxxx/@*)}"
> id="{(position() + $first_map_count) * 2 - 1}">
> <xsl:value-of select=". | xxxx/@*"/>
> </map>
> </xsl:template>
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [xsl] How do can I select disti, Cams Ismael | Thread | [xsl] Re: string processing, Dimitre Novatchev |
| Re: [xsl] monotonous nbsp coding, Vasu Chakkera | Date | [xsl] Xalan Extension Parameter, Paul Brady |
| Month |