This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RE: document() merge DISTINCT


Alex,
Something like this should do it
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
	<xsl:param name="file" />
	<xsl:template match="/">	
		<xsl:apply-templates select="/p/project" />
		<xsl:copy-of select="document($file)/p/project[not(@name
= current()/p/project/@name)]" />
	</xsl:template>
	<xsl:template match="project">
		<xsl:copy>
			<xsl:copy-of select="@*|*" />
			<xsl:copy-of
select="document($file)/p/project[@name =
current()/@name]/person[not(@id = current()/person/@id)]" />
		</xsl:copy>
	</xsl:template>
</xsl:stylesheet>

Ciao Chris

XML/XSL Portal
http://www.bayes.co.uk/xml


> -----Original Message-----
> From: owner-xsl-list@lists.mulberrytech.com 
> [mailto:owner-xsl-list@lists.mulberrytech.com] On Behalf Of 
> Alex Schuetz
> Sent: 19 December 2001 09:31
> To: XSL-List@lists.mulberrytech.com
> Subject: [xsl] document() merge DISTINCT
> 
> 
> Hallo;
> 
> I have some input files  with the /person/@id attribute being 
> unique in each file (and /project).
> 
> input.xml
> --------------------------------------------------------------
> <project name="some-name">
>     <person id="1" name="name1"/>
>     <person id="5" name="other-name"/>
>     <preson id="20" name ="another-name"/>
> </project>
> ------------------------------------------------
> 
> I want to merge these files so that I get a list of all 
> <person> that are in any <project> but the preson/@id should 
> be unique, that is, no <person> element should be listed twice.
> 
> In the book 'XSLT' from Dough Tidwell (chapter 7) there is an 
> example that works but is using a lot of disk reads and deep 
> recursion. It goes like this:
> 
> 1: build a variable var1 as a white-space separated sorted 
> list of all @id . (using <xsl:for-each select="document(...)"..../> )
> 2: build a variable var2 of unique @id from  var1 (by recursion);
> 3: with var2 call a template that  calls <xsl:for-each 
> select= "document(....)"../> for each id in var2 and produces 
> the output.
> 
> Is there a better way to do this?
> 
> -Alex
> asc@ala.de
> 
> 
> 
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 
> 


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]