[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Keys with different parents, but same name

Subject: Re: Keys with different parents, but same name
From: Ganesh Sindigi <ganeshaks@xxxxxxxxx>
Date: Mon, 27 Oct 2003 10:27:19 -0800 (PST)
different keys
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

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.