Subject: RE: [xsl] many-to-many From: "Brown, William S" <wsbrown@xxxxxxx> Date: Mon, 29 Jan 2007 14:22:38 -0500 |
> -----Original Message----- > From: Ronan Klyne [mailto:ronan.klyne@xxxxxxxxxxx] > Sent: Monday, January 29, 2007 5:04 AM > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: Re: [xsl] many-to-many > > > Brown, William S wrote: > > Esteemed experts, > > There are a number of examples out there on the net of > modelling 'many-to-many' relationship in XML. > > A recent one is > > > http://en.wikibooks.org/wiki/XML:_Managing_Data_Exchange/The_m > any-to-many_relationship > > and it is helpful, as far is it goes. > > However, Kevin Williams points out in > > http://www-128.ibm.com/developerworks/xml/library/x-xdm2m.html > > that the usual understanding of the 'many-to-many' > relationship is that it is a two-way street. > > > > That is, to use an example from the first document, I can > structure data about movies and actors such that each actor's > info is represented only once in the XML but pulled out > repeatedly as I generate a list of movies and the many actors > that appeared in each; same actors appear in multiple movies. > > Or, to use the classic example, I can represent details for > each part only once, but re-use it as I generate invoices, > each of which contains many of the same parts. > > Each of the above articles suggests an ID/IDREF approach > for doing this. > > However, Williams notes that in relational databases it is > simple to run the query in reverse, i.e., list the movies > that each actor has appeared in, or list the invoices on > which each part appears. Since the ID/IDREF is treated as > unidirectional, he suggests a double IDREF structure - paired > pointers pointing in opposite directions. > > Which brings me to my question - > > has anyone seen any sample xml/xsl that actually > demonstrated running the query in forward and reverse. > Everything I've seen uses ID/IDREF and xsl:key in one > direction and calls that a 'many-to-many' structure. But I'm > not clever enough to navigate back upstream (William implies > it can't be done) or to implement the XSL for the dual ID/IDREF. > > The first (wiki) article contains sample xml and xsl for > anyone who wants to investigate the issue. > > I hope you find this diverting (or at least can show me how > to do it LOL). > > > > Best, > > > > William S. Brown wsbrown@xxxxxxx > > Systems Engineering and Safety Analysis Group > > Brookhaven National Laboratory > > Building 130 TEL 631 344 7230 > > Upton, NY 11973-5000 FAX 631 344 4900 > > > > > > Hi William, > > I read the many-to-many problem as two one-to-many problems, > one in each > direction, for which keys are a good solution. > As far as I know, it is not possible to use a key in reverse, so two > keys must be used; one for each direction. > > I include an example involving parts and invoices. Is this the kind of > thing you had in mind? > > # r > > ----- Input data: > <doc> > <invoices> > <invoice id="i1"> > <part id="1"/> > <part id="2"/> > </invoice> > <invoice id="i2"> > <part id="5"/> > <part id="2"/> > </invoice> > <invoice id="i3"> > <part id="5"/> > <part id="3"/> > </invoice> > <invoice id="i4"> > <part id="5"/> > <part id="2"/> > </invoice> > <invoice id="i5"> > <part id="3"/> > <part id="4"/> > </invoice> > </invoices> > <parts> > <part name="part1" id="1"/> > <part name="part2" id="2"/> > <part name="part3" id="3"/> > <part name="part4" id="4"/> > </parts> > </doc> > > ----- Stylesheet: > <?xml version="1.0" encoding="ISO-8859-1"?> > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > version="1.0"> > <xsl:output method="html" indent="no" encoding="ISO-8859-1"/> > > <xsl:key name="p-i" match="/doc/invoices/invoice" use="part/@id"/> > <xsl:key name="i-p" match="/doc/invoices/invoice/part" use="../@id"/> > > <xsl:template match="invoice"> > <h3>invoice <xsl:value-of select="@id"/> contains:</h3> > <xsl:for-each select="key('i-p', @id)"> > part <xsl:value-of select="@id"/> > </xsl:for-each> > </xsl:template> > > <xsl:template match="part"> > <h3>part <xsl:value-of select="@id"/> was part of invoices:</h3> > > <xsl:for-each select="key('p-i', @id)"> > <xsl:value-of select="@id"/> > </xsl:for-each> > </xsl:template> > > <xsl:template match="doc"> > <h2>invoice to parts</h2> > <xsl:apply-templates select="invoices/*"/> > <h2>part to invoices</h2> > <xsl:apply-templates select="parts/*"/> > </xsl:template> > > </xsl:stylesheet> > ----- End. > > > -- > Ronan Klyne > Business Collaborator Developer > Tel: +44 (0)870 163 2555 > ronan.klyne@xxxxxxxxxxx > www.groupbc.com
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] many-to-many, Ronan Klyne | Thread | RE: [xsl] many-to-many, Brown, William S |
Re: [xsl] Flat DB structure into XM, David Carlisle | Date | [xsl] Dynamic Two Column Printing, Luke Jones |
Month |