title: Replace <c:if> and fn:toUpperCase() with JSF-tags
body: <p>This example is from a book on JSF. The excercise is to refactor the following Facelets code while eliminating <code>&lt;c:if&gt;</code> and <code>fn:toUpperCase()</code>. Usage of <code>&lt;c:forEach&gt;</code> is allowed.  </p>
  
  <p><code>#{myBean.numbers}</code> returns <code>String["one","two","three"]</code></p>
  
  <p>As the book is on JSF and not on Java, I suppose the existing Java-code is not to be touched. But I can't think of another way to do this solely in Facelets.</p>
  
  <pre><code>&lt;c:forEach var="item" items="#{myBean.numbers}"&gt;
      &lt;c:if test="#{not fn:endsWith(item,'o')}"&gt;
          #{item}
      &lt;/c:if&gt;
      &lt;c:if test="#{fn:endsWith(item,'o')}"&gt;
          #{fn:toUpperCase(item)}
      &lt;/c:if&gt;
  &lt;/c:forEach&gt;
  </code></pre>
  
  <p>Only thing I can think of is using a converter that conditionally uses <code>String#toUpperCase()</code> and then I still do not understand why use of <code>&lt;c:forEach&gt;</code> should still be allowed:</p>
  
  <pre><code>&lt;ui:repeat var="item" value="#{myBean.numbers}"&gt;
       &lt;h:outputText value="#{item}" converter="conditionalConverter"/&gt;
  &lt;/ui:repeat&gt;
  </code></pre>
  
  <p>Is there a more "Facelets way" to do this (and still a need to use <code>&lt;c:forEach&gt;</code>)?</p>
  
  <p><strong>UPDATE:</strong>
  Instead of <code>&lt;c:if&gt;</code> one could still use e.g. <code>&lt;h:outputPanel&gt;</code> and it's <code>rendered</code>-attribute, but there is still no Java-less replacement for <code>fn:toUpperCase()</code>.</p>
  
  <p>I am asking for learning purposes only. I suppose the <code>&lt;ui:repeat&gt;</code>-solution with a converter is the cleanest and represents most how JSF is supposed to be used. Do you think so, too?</p>