Subject: Re: [xsl] contains()??? From: "Gitanjali" <narsu@xxxxxxxxxxxxx> Date: Tue, 15 May 2001 22:15:24 -0400 |
Thanks a lot Jason, Great! Whatever the output I'm expecting, U gave me. Thanks for your clear explaination about my problem. Thanks again! Narsu ----- Original Message ----- From: "Diamond, Jason" <Jason.Diamond@xxxxxxx> To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx> Sent: Tuesday, May 15, 2001 9:45 PM Subject: RE: [xsl] contains()??? > You're not too clear on what you're trying to achieve. Do you only want to > output the employees that have id attributes listed in the id parameter? If > so, there's a number of problems that I can see in your transform and > they're all contribute to the results your getting. I'll list them off as in > the order I noticed them. > > Firstly, the first parameter to contains() is not what I think you think it > is. The innermost expression, emp[@id], is selecting all emp elements that > have an id attribute--not all the id attributes on the emp elements. You're > converting those elements into a string and testing to see if that string > contains the id. The string value of an emp element only contains an email > address and some whitespace. I think that you want to use emp/@id instead > which will select all of the id attributes on all of the emp elements. > > Also, if $id can contain comma separated IDs then you probably want to > switch the order in which you pass in your parameters. The contains() > function only returns true when the string value of the first parameter > contains the string value of the second parameter. Since your example source > document has id attributes that contain only single IDs, it will never be > true that they will contain a string like "1002,1003,1004" but it could be > true the other way around. > > More importantly, your xsl:if statements aren't even doing anything. They're > both empty. The instructions that you want to execute if a certain condition > is true need to be children of xsl:if. You have an xsl:apply-templates > between--not inside--two empty if statements so the apply-templates will > always happen. > > And the final reason for why you're outputting everybody is that your > xsl:apply-templates isn't using a predicate. Without a predicate (the part > in square brackets), it will select all emp child elements of the current > node. It should probably be something like this: > > <xsl:apply-templates select="emp[contains($id, @id)]"/> > > This will select all emp children who's id attribute is "contained" by the > $id parameter. > > I've made this change and cut out some of the dead code (as far as I can > reason) and the stylesheet now looks like this: > > <xsl:stylesheet version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > <xsl:output method="html" indent="no"/> > <xsl:param name="id" select="1003" /> > > <xsl:template match="addresses"> > <xsl:apply-templates select="emp[contains($id, @id)]"/> > </xsl:template> > > <xsl:template match="emp"> > <h1>Name: <xsl:value-of select="concat(details/@fname, ' ', > details/@lname)" /></h1> > <p>Email: <a href="mailto:{email}"><xsl:value-of select="email" > /></a><br /> > Country: <xsl:value-of select="details/@country" /><br /> > Phone: <xsl:value-of select="details/@phone" /> > </p> > </xsl:template> > </xsl:stylesheet> > > Running this on your example without specifying a value for id results in > only Kimberly Chung being output. Is that what you expected? > > Jason. > > -----Original Message----- > From: Gitanjali [mailto:narsu@xxxxxxxxxxxxx] > Sent: Tuesday, May 15, 2001 5:59 PM > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] contains()??? > > > All, > > Could you please solve my problem. Acutally I passed the parameter from the > html as id = "1002,1003,1004" > > Now I want to display only those records where parameter id matches the > input . The following xsl is not working...It's displaying all the results. > > <xsl:stylesheet version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > <xsl:output method="html" indent="no" /> > <xsl:param name="id" select="1003" /> > > <xsl:template match="addresses"> > <xsl:value-of select="$id"/> > <xsl:if test="contains(string(emp[@id]),string($id))"> </xsl:if> > <xsl:apply-templates select="emp"/> > <xsl:if test="contains(string(emp[@id]),string($id))"> </xsl:if> > </xsl:template> > > <xsl:template match="emp"> > <h1>Name: <xsl:value-of select="concat(details/@fname, ' ', > details/@lname)" /></h1> > <p>Email: <a href="mailto:{email}"><xsl:value-of select="email" > /></a><br /> > Country: <xsl:value-of select="details/@country" /><br /> > Phone: <xsl:value-of select="details/@phone" /> > </p> > </xsl:template> > </xsl:stylesheet> > > > My xml file is : > > <addresses> > <emp registered="20010125" id="1001"> > <email>scott@xxxxxxxxxx</email> > <details fname="Scott" lname="Wilson" country="UK" phone="1800callme"/> > </emp> > <emp registered="20010125" id="1002"> > <email>john@xxxxxxxx</email> > <details fname="John" lname="Kerr" country="USA" phone="1800callJohn"/> > </emp> > <emp registered="20010125" id="1003"> > <email>kim@xxxxxxxxx</email> > <details fname="Kimberly" lname="Chung" country="USA" > phone="1800callKim"/> > </emp> > <emp registered="20010125" id="1004"> > <email>Tim@xxxxxxxxxx</email> > <details fname="Timmothy" lname="Kelley" country="USA" > phone="1800callTim"/> > </emp> > <emp registered="20010125" id="1005"> > <email>Marie@xxxxxxxxxxxx</email> > <details fname="Marie" lname="Whitaker" country="AU" > phone="1800callMarie"/> > </emp> > </addresses> > > > > Thanks > Narsu > > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] contains()???, Diamond, Jason | Thread | [xsl] Testing type of a param, Robin Meade |
RE: [xsl] contains()???, Diamond, Jason | Date | RE: [xsl] XPath for number of prece, Michael Kay |
Month |