Re: Problem when a use a x:forEach into another x:forEach
Rashmi Rubdi <[email protected]>
| Newsgroups | gmane.comp.jakarta.taglibs.user |
|---|---|
| Message-ID | <[email protected]> |
Sébastien,
I tried your original JSP code and was able to reproduce the problem you indicated in your first e-mail in JSTL 1.1 and Tomcat 5.5.
Then I made few changes to the JSP page as follows. I renamed some variables to make the code less ambiguous to read but the logic remains the same.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<c:import var="xml_collections" url="/p/test6/collections.xml" />
<x:parse xml="${xml_collections}" var="pCollections" scope="request"/>
<c:import var="xml_books" url="/p/test6/books.xml" />
<x:parse xml="${xml_books}" var="pBooks" scope="request"/>
<x:forEach select="$pCollections/collections/collection" var="vCollection">
<x:out select="name" />
<x:set select="id" var="cId"/>
<ul>
<x:forEach select="$pBooks/books/book[collection_id=$cId]" var="vBook">
<li><x:out select="$vBook/title" /></li>
print test
</x:forEach>
</ul>
</x:forEach>
The code inside the inner x:forEach never executes. I think it never executes because the inner for loop , is not inside the context of the XML node in the outer for loop.
If you look at the outer x:forEach loop
the xml context node is $pCollections/collections/collection , and in the inner x:forEach $pBooks/books/book , does not fall under the context of the the external loop.
If I'm not wrong, I think nesting of x:forEach works as long as the context of the nested x:forEach falls under that of the outer x:forEach.
One solution to achieve the nested output would be to first combine the 2 XML documents by transforming them with XSLT to create a new XML document, then use the new XML document to achieve the nesting. I haven't tried such a transformation, but I will try it in case I'm right about nesting of x:forEach doesn't work with unrelated contexts.
Are you saying that your original code worked in JSTL1.0 and is not working in JSTL1.1 ? Or you tried this code for the first time in JSTL1.1 and never in JSTL1.0?
-Rashmi
----- Original Message ----
From: Sébastien Brodeur <[email protected]>
To: Tag Libraries Users List <[email protected]>
Sent: Saturday, January 27, 2007 8:37:56 AM
Subject: Re: Problem when a use a x:forEach into another x:forEach
Hi Rashmi,
Thank you for the answer.
Have you been able to reproduce the error? Is my syntax wrong (I'm not
thrill by Node context :-) ?
Even if a try to use a <c:catch> block, I got no error. (I still have to
look in the error log thou, first think Monday morning).
1) By using Servlet 2.4 jar, you mean are we using a Servlet
2.4container? If so, yes.
2) I already change the web.xml file to use servlet 2.4
3) I use a local version (I made sure the .tld file are the one coming with
the taglibs JSTL 1.1 package.) of the taglibs declaration.
So I use:
<%@ taglib prefix="c" uri="/WEB-INF/c.tld" %>
<%@ taglib prefix="x" uri="/WEB-INF/x.tld" %>
instead of:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"; %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"; %>
If a try the latest, I got a error. (Is it only namespace or some firewall
may be blocking those???)
Once again, thank you
On 1/27/07, Rashmi Rubdi <[email protected]> wrote:
>
> Are you getting any errors in the log?
>
> When you upgrade from JSTL1.0 to JSTL1.1 you need to make some changes or
> verify these changes:
>
> 1) Use Servlet 2.4 jar
>
> 2) Change web.xml to servlet 2.4 version:
>
> <web-app version="2.4"
> xmlns="http://java.sun.com/xml/ns/j2ee";
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
> xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
> http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd";>
>
> 3) Change tag library declarations to:
>
> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"; %>
> <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"; %>
> Similarly upgrade other JSTL namespace URIs
>
> -Rashmi
>
> ----- Original Message ----
> From: Sébastien Brodeur <[email protected]>
> To: [email protected]
> Sent: Friday, January 26, 2007 2:03:02 PM
> Subject: Problem when a use a x:forEach into another x:forEach
>
>
> I'm currently migrating my application from WebSphere 5 (JSTL 1.0) to
> WebSphere 6 (JSTL 1.1), and so far, the XML taglibs give us a lot of
> trouble.
>
> For example :
>
>
> ------------------------------------------------------------------------------------------------------
> collections.xml
>
> <?xml version="1.0" encoding="ISO-8859-1"?>
> <collections>
> <collection>
> <id>horror</id>
> <name>Horror novel</name>
> </collection>
> <collection>
> <id>scifi</id>
> <name>Sci-Fi novel</name>
> </collection>
> </collections>
>
>
> ------------------------------------------------------------------------------------------------------
> books.xml
>
> <?xml version="1.0" encoding="ISO-8859-1"?>
> <books>
> <book>
> <collection_id>scifi</collection_id>
> <title>Robots</title>
> </book>
> <book>
> <collection_id>scifi</collection_id>
> <title>The Moon is a Hashes Mistress</title>
> </book>
> <book>
> <collection_id>scifi</collection_id>
> <title>Spaceship Tropper</title>
> </book>
> <book>
> <collection_id>horror</collection_id>
> <title>This</title>
> </book>
> </books>
>
>
> ------------------------------------------------------------------------------------------------------
> books.jsp
>
> <%@ taglib prefix="c" uri="/WEB-INF/c.tld" %>
> <%@ taglib prefix="x" uri="/WEB-INF/x.tld" %>
>
> <c:import var="xml_collections" url="http://localhost/collections.xml";; />
> <x:parse xml="${xml_collections}" var="collections" scope="request"/>
>
> <c:import var="xml_books" url="http://www.localhost/books.xml";; />
> <x:parse xml="${xml_books}" var="books" scope="request"/>
>
> <x:forEach select="$collections/collections/collection" var="collection">
> <x:out select="$collection/name" />
> <ul>
> <x:forEach select="$books/books/book[collection_id=$collection/id]"
> var="book">
> <li><x:out select="$book/title" /></li>
> </x:forEach>
> </ul>
> </x:forEach>
>
>
> ------------------------------------------------------------------------------------------------------
> Output (WebSphere 5 using JSTL 1.0)
>
> Horror novel
> <ul>
> <li>This</li>
> </ul>
>
> Sci-Fi novel
> <ul>
> <li>Robots</li>
> <li>The Moon is a Hashes Mistress</li>
> <li>Spaceship Tropper</li>
> </ul>
>
>
> ------------------------------------------------------------------------------------------------------
>
> Output (WebSphere 6 using JSTL 1.1)
>
> Horror novel
> <ul>
> </ul>
> Sci-Fi novel
> <ul>
> </ul>
>
>
> Any idea how to do that without changing the structure of the two XML
> files?
>
> Thank!
>
> --
> Sébastien Brodeur
> [email protected]
> Site Web : http://www.un-programmeur-php.ca/
>
>
>
>
> ____________________________________________________________________________________
> Cheap talk?
> Check out Yahoo! Messenger's low PC-to-Phone call rates.
> http://voice.yahoo.com
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>
--
Sébastien Brodeur
[email protected]
Site Web : http://www.un-programmeur-php.ca/
____________________________________________________________________________________
Yahoo! Music Unlimited
Access over 1 million songs.
http://music.yahoo.com/unlimited