[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
RE: [xsl] Finding distinct nodes using a function in XSLT 2.0
Subject: RE: [xsl] Finding distinct nodes using a function in XSLT 2.0 From: "Scott Lynch" <slynch@xxxxxxxxxx> Date: Tue, 17 Apr 2007 21:43:27 -0400 |
Dimitre, That works nicely. However, is there any difference between <xsl:sequence select="."/> (which works) rather than say <xsl:sequence select="current-group()[1]"/> which also works, in the overall template logic? thanks, Scott -----Original Message----- From: Dimitre Novatchev [mailto:dnovatchev@xxxxxxxxx] Sent: Tuesday, April 17, 2007 4:51 PM To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Subject: Re: [xsl] Finding distinct nodes using a function in XSLT 2.0 THe following transformaton s a straightforward solutionto this proble: <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:variable name="vDoc1" as="document-node()" select="document('file:///C:/XSLT/Tests/docFoo1.xml')"/> <xsl:variable name="vDoc2" as="document-node()" select="document('file:///C:/XSLT/Tests/docFoo2.xml')"/> <xsl:template match="/"> <foo> <xsl:for-each-group select="($vDoc1 | $vDoc2)/*/bar" group-by="@id"> <xsl:sort select="current-grouping-key()"/> <xsl:sequence select="."/> </xsl:for-each-group> </foo> </xsl:template> </xsl:stylesheet> -- Cheers, Dimitre Novatchev --------------------------------------- Truly great madness cannot be achieved without significant intelligence. --------------------------------------- To invent, you need a good imagination and a pile of junk ------------------------------------- You've achieved success in your field when you don't know whether what you're doing is work or play On 4/17/07, Scott Lynch <slynch@xxxxxxxxxx> wrote: > This probably isn't the easiest way to this (suggestions welcome), but > I'm collecting data from two similarly structured source documents and > wanting to build a set of distinct nodes based on a certain attribute > value. Example XML: > > doc1.xml > <foo> > <bar id="a" /> > <bar id="b" /> > <bar id="c" /> > <bar id="d" /> > <bar id="g" /> > </foo> > > doc2.xml > <foo> > <bar id="a" /> > <bar id="b" /> > <bar id="c" /> > <bar id="d" /> > <bar id="e" /> > <bar id="f" /> > </foo> > > Desired resulting node set: > > <foo> > <bar id="a" /> > <bar id="b" /> > <bar id="c" /> > <bar id="d" /> > <bar id="e" /> > <bar id="f" /> > <bar id="g" /> > </foo> > > I'm required to provide a template function (or equivalent set of > templates which returns a node set for use by various for-each > constructs in other processors) which accepts the xpath (e.g. /foo/bar) > and an index attribute (e.g. "id") as parameters and returns a node set > as seen above. > > I've managed to write a function which generates a sorted union (I think > I need them sorted to find the distinct values, correct? sorry, newbie > here..), but have yet to find a way to trim the results set so that it > contains only distinct members. Here's what I have so far: > > <xsl:variable name="compare_file" select="document('doc2.xml')"/> > <xsl:variable name="current_file" select="document('doc1.xml')"/> > > <xsl:function name="con:distinct_rows"> > <!-- Selects the distinct rows from the source docs and --> > <!-- comparison doc --> > <xsl:param name="path"/> > <xsl:param name="key"/> > <xsl:variable name="source_rows" > select="$current_file/saxon:evaluate($path)"/> > <xsl:variable name="compare_rows" > select="$compare_file/saxon:evaluate($path)"/> > <xsl:variable name="sorted_union_rows"> > <xsl:for-each select="$source_rows | $compare_rows"> > <xsl:sort data-type="text" select="./saxon:evaluate($key)"/> > <xsl:sequence select="."/> > </xsl:for-each> > </xsl:variable> > <xsl:sequence select="$sorted_union_rows"/> > <!-- ??? distinct node selector instead ??? --> > </xsl:function> > > > Once I have the sorted union, I've tried various following/previous > sibling selectors but have yet to find a command which generates the > distinct node set (I can find the unique nodes based on the "id" but > that's not really helping me). > > Any suggestions? > > thanks a lot! > Scott Lynch
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Finding distinct nodes us, Dimitre Novatchev | Thread | Re: [xsl] Finding distinct nodes us, Dimitre Novatchev |
Re: [xsl] Capitalising the first le, Kamal Bhatt | Date | Re: [xsl] Finding distinct nodes us, Dimitre Novatchev |
Month |