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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.