This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: contains()???
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@MKG.com>
To: <xsl-list@lists.mulberrytech.com>
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@gitanjali.com]
> Sent: Tuesday, May 15, 2001 5:59 PM
> To: xsl-list@lists.mulberrytech.com
> 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@wilson.com</email>
> <details fname="Scott" lname="Wilson" country="UK" phone="1800callme"/>
> </emp>
> <emp registered="20010125" id="1002">
> <email>john@kerr.com</email>
> <details fname="John" lname="Kerr" country="USA" phone="1800callJohn"/>
> </emp>
> <emp registered="20010125" id="1003">
> <email>kim@chung.com</email>
> <details fname="Kimberly" lname="Chung" country="USA"
> phone="1800callKim"/>
> </emp>
> <emp registered="20010125" id="1004">
> <email>Tim@kelley.com</email>
> <details fname="Timmothy" lname="Kelley" country="USA"
> phone="1800callTim"/>
> </emp>
> <emp registered="20010125" id="1005">
> <email>Marie@Whitaker.com</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