Subject: RE: [xsl] Conditioned merge of XML from two files From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Wed, 27 Jul 2005 23:11:56 +0100 |
What's happening here: <xsl:copy-of select="$locationFile/locations/location/*[.//location/loc_id=$locationFile/ locations//location/id]"/> is that you're (very) muddled about the context node. You want to select a location that satisfies a condition. Write a path that selects all the locations, then a predicate containing the condition. Inside the predicate, "." is the location you are testing, and current() is the book you are testing it against (you had a typo, match="event"). So you want $locationFile/locations/location[./loc_id = current()/location/loc_id] To refine this: (a) "./" is redundant and can be omitted - but I included it for clarity and you may want to do the same (b) if there are many locations, you can make this more efficient using keys. Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: Karl Koch [mailto:TheRanger@xxxxxxx] > Sent: 27 July 2005 21:44 > To: Mulberry list > Subject: [xsl] Conditioned merge of XML from two files > > Hello Experts, > > I have a question resulting from a problem I could not > resolve. I have one > XML file which contains information about books (books.xml). > I have a second > xml file which contains information about book locations > (locations.xml). I > have a location id in books.xml and each location in > locations.xml has a > location id of the same sort. I would like to have a > stylesheet that looks > up the ids from books.xml in locations.xml and copies the > location into a > certain position of the book. After the transformation, each book in > books.xml has a location XML stubstructure. > > Here example data from both XML files: > > (books.xml - only one book to keep it short) > > <bookshelf> > <book> > <id>1</id> > <title>Alice in Wonderland</title> > <desc>Alice is tumbling down the rabit hole.</desc> > <location> > <loc_id>L2</loc_id> > </location> > </book> > ... and many many more ... > </bookshelf> > > > (locations.xml - only one location to keep it short) > > <locations> > <location> > <loc_id>L1</loc_id> > <name>Location 1</name> > ... many more attributes... > </location> > .. many more locations > </locations> > > > After the transformation I wouild like to have the following: > > <bookshelf> > <book> > <id>1</id> > <title>Alice in Wonderland</title> > <desc>Alice is tumbling down the rabit hole.</desc> > <location> > <loc_id>L1</loc_id> > <name>Location 1</name> > ... many more attributes... > </location> > </book> > ... and many many more ... > </bookshelf> > > > I have developed the following XSLT: > > > <xsl:stylesheet version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > <xsl:output method="xml" indent="yes" encoding="UTF-8" /> > <xsl:strip-space elements="*" /> > <xsl:variable name="locationFile" > select="document('locations.xml')" /> > > <!-- Match with root --> > <xsl:template match="/"> > <bookshelf> > <xsl:for-each select="/bookshelf/book"> > <book> > <xsl:apply-templates select="." /> > </book> > </xsl:for-each> > </bookshelf> > </xsl:template> > > <xsl:template match="event"> > <xsl:copy-of select="./id" /> > <xsl:copy-of select="./title" /> > <xsl:copy-of select="./desc" /> > <location> > <xsl:copy-of > select="$locationFile/locations/location/*[.//location/loc_id= > $locationFile/locations//location/id]"/> > </location> > </xsl:template> > > </xsl:stylesheet> > > > > ... however, it does not work: What is wrong? I guess it is > far from optimal > anyway so I am happy to get completely different solutions as > well. As you > can see in the stylesheet, I would like to "hardcode" the > lcoations file, > but provide the book data as parameter (for flexiblity reasons). > > Any form of help would be highly appreciated. > > Kind regards, > Karl > > > > > > -- > 5 GB Mailbox, 50 FreeSMS http://www.gmx.net/de/go/promail > +++ GMX - die erste Adresse f|r Mail, Message, More +++
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Conditioned merge of XML from, Karl Koch | Thread | RE: [xsl] Conditioned merge of XML , cknell |
[xsl] rowspan - colspan, cookie king | Date | RE: [xsl] go from double to integer, Michael Kay |
Month |