[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
[xsl] Finding distinct nodes using a function in XSLT 2.0
Subject: [xsl] Finding distinct nodes using a function in XSLT 2.0 From: "Scott Lynch" <slynch@xxxxxxxxxx> Date: Tue, 17 Apr 2007 16:15:57 -0400 |
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] saxon:evaluate and extern, Scott Lynch | Thread | Re: [xsl] Finding distinct nodes us, Dimitre Novatchev |
Re: [xsl] XSLT Dead?, David Carlisle | Date | Re: [xsl] Finding distinct nodes us, Dimitre Novatchev |
Month |
Keywords