[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
Re: [xsl] Assembling nodes from parts outside of the current node
Subject: Re: [xsl] Assembling nodes from parts outside of the current node From: "Mark Peters" <flickrmeister@xxxxxxxxx> Date: Thu, 25 Oct 2007 12:43:07 -0400 |
Hi Scott, Thanks for the help! I applied your transformation to the original document, but the output doesn't include the part data. Any idea why? <?xml version="1.0" encoding="UTF-8"?> <insects> <insect> <name>Bee</name> <parts> <part/> <part/> </parts> </insect> <insect> <name>Caterpillar</name> <parts> <part/> </parts> </insect> <insect> <name>Butterfly</name> <parts> <part/> <part/> </parts> </insect> </insects> Thanks, Mark On 10/25/07, Scott Trenda <Scott.Trenda@xxxxxxxx> wrote: > Keys are your friends! :) > > <xsl:stylesheet version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > > <xsl:key name="parts" match="allParts/part" use="@id"/> > > <xsl:template match="insects|insect|insect/name"> > <xsl:copy> > <xsl:apply-templates/> > </xsl:copy> > </xsl:template> > > <xsl:template match="partMaps"> > <parts> > <xsl:apply-templates/> > </parts> > </xsl:template> > > <xsl:template match="partMap"> > <part> > <xsl:apply-templates select="key('parts', @id)/@*"/> > </part> > </xsl:template> > > <xsl:template match="allParts/part/@*"> > <xsl:element name="{name()}"> > <xsl:value-of select="."/> > </xsl:element> > </xsl:template> > > </xsl:stylesheet> > > ~ Scott > > > -----Original Message----- > From: Mark Peters [mailto:flickrmeister@xxxxxxxxx] > Sent: Thursday, October 25, 2007 11:02 AM > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] Assembling nodes from parts outside of the current node > > Hi Everyone, > > This one has me stumped. I have a collection of nodes that store the > names of insects and include sub-nodes that map to the parts of > insects, stored elsewhere in the document. > > <?xml version=" 1.0" encoding="UTF-8"?> > <kingdoms> > <kingdom> > <insects> > <insect> > <name>Bee</name> > <partMaps> > <partMap mapId="pmap01" partId="part01"/> > <partMap mapId="pmap01" partId="part02"/> > </partMaps> > </insect> > <insect> > <name>Caterpillar</name> > <partMaps> > <partMap mapId="pmap02" partId="part01"/> > </partMaps> > </insect> > <insect> > <name>Butterfly</name> > <partMaps> > <partMap mapId="pmap03" partId="part01"/> > <partMap mapId="pmap01" partId="part02"/> > </partMaps> > </insect> > </insects> > <allParts> > <part id="part01" name="legs" description="Walks with > these"/> > <part id="part02" name="wings" description="Flies with > these"/> > </allParts> > </kingdom> > </kingdoms> > > > What I'm trying to do is list each insect and its parts in a series of > nodes, as follows. For each insect, I only want to display the parts > that pertain to that insect. > > > <?xml version="1.0" encoding="UTF-8"?> > <insects> > <insect> > <name>Bee</name> > <parts> > <part> > <name>Legs</name> > <description>Walks with these</description> > </part> > <part> > <name>Wings</name> > <description>Flies with these</description> > </part> > </parts> > </insect> > <insect> > <name>Caterpillar</name> > <parts> > <part> > <name>Legs</name> > <description>Walks with these</description> > </part> > </parts> > </insect> > <insect> > <name>Butterfly</name> > <parts> > <part> > <name>Legs</name> > <description>Walks with these</description> > </part> > <part> > <name>Wings</name> > <description>Flies with these</description> > </part> > </parts> > </insect> > </insects> > > > I thought I'd simply need to compare the partMap/@partId values with > the corresponding part/@id values, as follows. The output currently > displays the insects, but not their parts. (We could argue that if > there are no parts, there are no objects. But that's another > discussion. :-) > > > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > version="1.0"> > <xsl:output method="xml" version=" 1.0"/> > <xsl:template match="/"> > <insects> > <xsl:for-each select="kingdoms/kingdom > /insects/insect"> > <xsl:sort select="name"/> > <insect> > <name> > <xsl:value-of select="name"/> > </name> > <xsl:for-each select="partMaps/partMap"> > <xsl:choose> > <xsl:when > test="@partId=:../../../allParts/part/@id"> > <part> > <name> > <xsl:value-of > select=":../../../allParts/part/@name"/> > </name> > <description> > <xsl:value-of > select=":../../../allParts/part/@description"/> > </description> > </part> > </xsl:when> > <xsl:otherwise/> > </xsl:choose> > </xsl:for-each> > </insect> > </xsl:for-each> > </insects> > </xsl:template> > </xsl:stylesheet> > > > By the way, I'm not an entomologist. Insects probably don't belong > directly within kingdoms. They're probably a genus or species or > something. :-) This is just test data. > > Thanks in advance for any help you could offer. > > Mark > > -- > > Mark Peters > Senior Technical Writer > Saba Software > > -- Mark Peters Senior Technical Writer Saba Software
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Assembling nodes from par, Scott Trenda | Thread | Re: [xsl] Assembling nodes from par, Colin Adams |
RE: [xsl] Assembling nodes from par, Scott Trenda | Date | Re: [xsl] Assembling nodes from par, Colin Adams |
Month |