Subject: RE: [xsl] document() merge DISTINCT From: "Chris Bayes" <chris@xxxxxxxxxxx> Date: Wed, 19 Dec 2001 19:07:44 -0000 |
In that case use http://www.bayes.co.uk/xml/index.xml?/xml/utils/transquery/transquery.xm l v2 with the -e option <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tq="http://transquery.org" > <xsl:output method="xml" encoding="UTF-8" /> <xsl:param name="tq:input"/> <xsl:template match="/"> <xsl:for-each select="$tq:input//person[not(@id = preceding::person/@id)]"> <xsl:sort select="@id" data-type="number" order="ascending" /> <xsl:copy-of select="." /> </xsl:for-each> </xsl:template> </xsl:stylesheet> Ciao Chris XML/XSL Portal http://www.bayes.co.uk/xml > -----Original Message----- > From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx > [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of > Alex Schuetz > Sent: 19 December 2001 17:13 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: Re: [xsl] document() merge DISTINCT > > > Hi Chris, > if I understand it right, your approach works if I want to > merge two documents, that is, the argument for document() is > just one file. > > What I want to do, is to merge more then two files at once. > In this case it is not sufficant to compare the unique id to > my source tree. I have to make sure, the id is unique for all > files. Jeni Tennison suggestion makes sense to me.... > > -Alex > > ----- Original Message ----- > From: "Chris Bayes" <chris@xxxxxxxxxxx> > To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx> > Sent: Wednesday, December 19, 2001 5:17 PM > Subject: RE: [xsl] document() merge DISTINCT > > > > I was testing using non unique ids because I didn't read > your request > > right. So I was trying to keep the ids unique within a > project. This > > should work > > <?xml version="1.0"?> > > <xsl:stylesheet version="1.0" > > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > > <xsl:param name="file" /> > > <xsl:variable name="root" select="/" /> > > <xsl:template match="/"> > > <p> > > <xsl:apply-templates select="/p/project" /> > > <xsl:copy-of select="document($file)/p/project[not(@name > > = current()/p/project/@name)]" /> > > </p> > > </xsl:template> > > <xsl:template match="project"> > > <xsl:copy> > > <xsl:copy-of select="@*" /> > > <xsl:copy-of select="*" /> > > <xsl:copy-of > > select="document($file)/p/project[@name = > > current()/@name]/person[not(@id = $root//@id)]" /> > > </xsl:copy> > > </xsl:template> > > </xsl:stylesheet> > > > > On this input > > > > <?xml version="1.0" ?> > > <p> > > <project name="some-name1"> > > <person id="1" name="name1"/> > > <person id="4" name="other-name"/> > > <person id="8" name ="another-name"/> > > </project> > > <project name="some-name2"> > > <person id="2" name="name1"/> > > <person id="5" name="other-name"/> > > <person id="9" name ="another-name"/> > > </project> > > <project name="some-name3"> > > <person id="3" name="name1"/> > > <person id="6" name="other-name"/> > > <person id="10" name ="another-name"/> > > <person id="13" name ="another-name"/> > > </project> > > </p> > > > > <?xml version="1.0" ?> > > <p> > > <project name="some-name1"> > > <person id="1" name="name1"/> > > <person id="4" name="other-name"/> > > <person id="8" name ="another-name"/> > > </project> > > <project name="some-name2"> > > <person id="2" name="name1"/> > > <person id="5" name="other-name"/> > > <person id="9" name ="another-name"/> > > </project> > > <project name="some-name3"> > > <person id="3" name="name1"/> > > <person id="6" name="other-name"/> > > <person id="10" name ="another-name"/> > > <person id="15" name ="another-name"/> > > </project> > > <project name="some-name4"> > > <person id="16" name="name1"/> > > <person id="20" name="other-name"/> > > <person id="24" name ="another-name"/> > > <person id="29" name ="another-name"/> > > </project> > > </p> > > > > Gives > > > > <?xml version="1.0" encoding="UTF-16"?> > > <p> > > <project name="some-name1"> > > <person id="1" name="name1" /> > > <person id="4" name="other-name" /> > > <person id="8" name="another-name" /> > > </project> > > <project name="some-name2"> > > <person id="2" name="name1" /> > > <person id="5" name="other-name" /> > > <person id="9" name="another-name" /> > > </project> > > <project name="some-name3"> > > <person id="3" name="name1" /> > > <person id="6" name="other-name" /> > > <person id="10" name="another-name" /> > > <person id="13" name="another-name" /> > > <person id="15" name="another-name" /> > > </project> > > <project name="some-name4"> > > <person id="16" name="name1" /> > > <person id="20" name="other-name" /> > > <person id="24" name="another-name" /> > > <person id="29" name="another-name" /> > > </project></p> > > > > If you just want a list of combined unique people then this > will 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="/"> > > <p> > > <xsl:copy-of select="//person" /> > > <xsl:copy-of select="document($file)//person[not(@id = > > current()//@id)]" /> </p> > > </xsl:template> > > </xsl:stylesheet> > > > > The current function just changes context back to the > source tree. If > > you didn't use it i.e. document($file)//person[not(@id = > //@id)] would > > give you nothing because the context of //@id would be on the > > document() tree. This [@id = current()//@id] gives a set of > all @ids > > that are the same and this [not(@id = current()//@id)] > gives a set of > > all @ids that are different. > > > > Ciao Chris > > > > XML/XSL Portal > > http://www.bayes.co.uk/xml > > > > > > > -----Original Message----- > > > From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx > > > [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of Alex > > > Schuetz > > > Sent: 19 December 2001 12:35 > > > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > > > Subject: Re: [xsl] document() merge DISTINCT > > > > > > > > > Hallo Chris, > > > > > > it does not work for me as expected.. > > > > > > I guess, I do not understand the meaning on current() in this > > > context: > > > > > > To make it simpler for me, say I have more then two > files I want to > > > merge > > > as: > > > > > > sample.xml: > > > <p> > > > <person name="name2" id="2"/> > > > <person name="name3" id="8"/> > > > <person name="name4" id="32"/> > > > </p> > > > > > > In each file all /person/@id are unique, but different > files might > > > contain the same @id . Now I want to produce a list of > all <person> > > > so that /person/@id is unique. > > > > > > As you suggested, I tried: > > > > > > <xsl:template match="person"> > > > <xsl:copy> > > > <xsl:copy-of > > > select="document($file)/p/person[not(@id = > current()/p/person/@id]"/> > > > </xsl:copy> > > > </xsl:template> > > > > > > It looks to me, that [not(@id = current()/p/person/@id] is always > > > true and I get a list with non unique <person>. > > > > > > -Alex > > > > > > > > > > > > ----- Original Message ----- > > > From: "Chris Bayes" <chris@xxxxxxxxxxx> > > > To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx> > > > Sent: Wednesday, December 19, 2001 12:30 PM > > > Subject: RE: [xsl] 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@xxxxxxxxxxxxxxxxxxxxxx > > > > > [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On > Behalf Of Alex > > > > > Schuetz > > > > > Sent: 19 December 2001 09:31 > > > > > To: XSL-List@xxxxxxxxxxxxxxxxxxxxxx > > > > > 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@xxxxxx > > > > > > > > > > > > > > > > > > > > > > > > > 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 > > > > > > > > > > > > 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] document() merge DISTINCT, Alex Schuetz | Thread | Re: [xsl] document() merge DISTINCT, Trevor Nash |
Re: [xsl] One nodeset, multiple bra, Wendell Piez | Date | Re: [xsl] Parameter substitution, Wendell Piez |
Month |