Subject: Re: [xsl] Keys with different parents, but same name From: Ganesh Sindigi <ganeshaks@xxxxxxxxx> Date: Mon, 27 Oct 2003 10:27:19 -0800 (PST) |
Wendell Thanks for pointing me in right direction. This indeed worked. But did not solved the problem :-(. The reason for using different keys is there could be different types of groups and styling/rendering would change accordingly. For brevity, i had mentioned only field and fieldGroup. May be to resolve this I think will have to look into design stuff. And another doubt is regarding the way of changing the context node to fieldHeaders document, if we use <xsl:for-each ...> wont this reduce the performance? I might be wrong here. <xsl:variable name="keyvalue" select="concat(@id,'-')"/> <xsl:for-each select="$fieldHeaders"> <xsl:value-of select="key('label-by-field', $keyvalue)"/> </xsl:for-each> Thanks, Ganesh. --- Wendell Piez <wapiez@xxxxxxxxxxxxxxxx> wrote: > Hi Ganesh, > > At 04:24 PM 10/24/2003, you wrote: > >I'm a bit stuck in usage of XSLT lookup tables > using > >xsl:key. > >I'm sure someone on the list can help me or direct > me > >in the right direction. > > I've looked at your code, though I haven't banged on > it hard enough to know > everything it's doing, and see a few problems with > it. > > Rather than try to sort them out, however, I think > just pointing you in the > right direction, as you requested, should suffice. > > Rather than use two different keys, one that > retrieves fields by @id, the > other that retrieves fieldGroups by @id, I'd use a > single key. Construct it > like this: > > <xsl:key name="label-by-field" match="label" > use="concat(ancestor::fieldgroup/@id, '-', > parent::field/@id)"/> > > Notice this is a compound key. It retrieves a > <label> element (I'm going > straight for the label), using the concatenation of > its grandparent or > parent fieldgroup's @id (if it doesn't have one, > this will be '') and its > parent field's @id (again this will be '' if there > is no parent field). > > So you will have key values such as > '-customerId' (the label retrieved has value > "Customer Id : ") > 'homeAddress-' (the label is "House Address") > 'homeAddress-street' (the label retrieved is > "Street"). > > Then, when processing a fieldGroup, you can retrieve > its label simply by doing: > > <xsl:variable name="keyvalue" > select="concat(@id,'-')"/> > <xsl:for-each select="$fieldHeaders"> > <xsl:value-of select="key('label-by-field', > $keyvalue)"/> > </xsl:for-each> > > ...and when processing a field, you can get its > label likewise: > > <xsl:variable name="keyvalue" > > select="concat(ancestor::fieldGroup/@id,'-',@id)"/> > <xsl:for-each select="$fieldHeaders"> > <xsl:value-of select="key('label-by-field', > $keyvalue)"/> > </xsl:for-each> > > Notice both times you have first to bind your key > value to a variable, then > change your context node to the fieldHeaders > document so you can retrieve > your labels from there. > > Note: untested. But I hope the concept is clear. > Also I'm assuming that you > have only one layer of fieldGroup wrapping your > fields. > > Cheers, > Wendell > > >I have created a stylesheet which would render the > xml > >document by picking up the > >labels for the fields from a separate document. > The > >'field' is used as key. > >These 'field' elements could be contained within > group > >so they are repeatable e.g. field@id = city, but > label > >for them would be different > >depending upon the group they are in like in this > case > >for home address it is called City and for company > >address its Location. > > > >The problem i am facing is I am always getting the > >first 'field' element. The way i have done could > be > >wrong. > > > >I tried looking into all the archives, but could > not > >find anything related to this. > > > >How do I get the label related to field element wrt > >its parent. Any Help would be greatly appreciated. > > > >Thanks, > >Ganesh. > > > >Here is my styleSheet: > > > ><?xml version="1.0" encoding="UTF-8"?> > ><xsl:stylesheet version="1.0" > >xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > > <xsl:output indent="yes" method="html"/> > > > > <xsl:key name="field-lookup" match="field" > >use="@id"/> > > > > <xsl:key name="fieldGroup-lookup" > >match="fieldGroup" use="@id"/> > > > > <xsl:variable name="fieldHeaders" > >select="document('Headers.xml')/fieldHeaders"/> > > > > > > <xsl:template match="/"> > > <html> > > <style type="text/css"> > > body {color:black; background-color: > >white} > > </style> > > <body> > > <table border="1"> > > <xsl:apply-templates/> > > </table> > > </body> > > </html> > > </xsl:template> > > > > <xsl:template match="customer"> > > <br /> > > <table border="1"> <xsl:apply-templates /> > ></table> > > </xsl:template> > > <xsl:template match="fieldGroup"> > > <TR> > > <TD colspan="2" bgcolor="CCAA00" > >style="font-family:verdana;font-size:80%;color:white"> > > <xsl:apply-templates > >select="$fieldHeaders"> > > <xsl:with-param name="curr-label" > >select="."/> > > </xsl:apply-templates> > > </TD> > > </TR> > > <xsl:apply-templates/> > > </xsl:template> > > > > <xsl:template match="fieldList"> > > <xsl:apply-templates select="field"/> > > </xsl:template> > > > > <xsl:template match="field"> > > <TR> > > <TD bgcolor="00AACC" > >style="font-family:verdana;font-size:80%;color:white"> > > <xsl:apply-templates > >select="$fieldHeaders"> > > <xsl:with-param name="curr-label" > >select="."/> > > </xsl:apply-templates> > > </TD> > > <TD> > > <xsl:value-of select="text()"/> > > </TD> > > </TR> > > </xsl:template> > > > > <xsl:template match="fieldHeaders"> > > <xsl:param name="curr-label"/> > > <xsl:variable name="switch" > >select="name($curr-label/.)"/> > > <xsl:variable name="parent" > >select="name($curr-label/..)"/> > > <xsl:value-of select="key(concat($switch, > >'-lookup'), $curr-label/@id)/label"/> > > </xsl:template> > > > ></xsl:stylesheet> > > > >Here is XML document: > > > ><?xml version="1.0" encoding="UTF-8"?> > ><?xml-stylesheet type="text/xsl" > href="format.xsl"?> > ><customerList> > > <customer> > > <field id="customerId">cust1</field> > === message truncated === __________________________________ Do you Yahoo!? Exclusive Video Premiere - Britney Spears http://launch.yahoo.com/promos/britneyspears/ XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Keys with different paren, Wendell Piez | Thread | Re: [xsl] Keys with different paren, Wendell Piez |
RE: [xsl] Do a copy of a document b, Michael Kay | Date | Re: [xsl] Placing selective links i, J.Pietschmann |
Month |