Whilst I am in perfect agreement with most of what you said, there are a few
bits that in my own little heretically pervert vision still do not comply.

Note, my vision is biased by spending lately _WAY_ too much time having to
deal with our own (work) "graphics" team, a bunch of great guys considering
Macromedia DreamWeaver the _ultimate_ tool...

On 2/4/03 19:25, "Stefano Mazzocchi" <[EMAIL PROTECTED]> wrote:

> 5) control should be inverted: the template must be a view, it should be
> 'pushed' the data in, it should not contain any data-pulling logic other
> than the one used to pull data from the dataset passed on by the
> underlying controlling stage.

Well, yes and no, to some extent. I'd better explain it with a real-world
example: let's assume I have to display in HTML the following article (VNU
is a publishing company, so that has been my focus in the past year):

<article number="100"
         author="Pier Fumagalli">
  <title>Apache Cocoon 2.1 sees the light of a release</title>
  <body>
    <p>
      The Apache Cocoon team announced today that the new release
      of their <b>Cocoon</b> publishing engine is ready for prime
      time.
    </p>
    <p>
      To get more info see the <a href="http://cocoon.apache.org";>
      Apache Cocoon Web Site</a>.
    </p>
  </body>
</article>

Pretty easy XSLT stylesheet, indeed. But now, let's say that our editing
team wants to display something more about the author, for example his
picture, and his email address. This data is available already from another
XML source available somewhere else:

<author>
  <name>Pier Fumagalli</name>
  <email>[EMAIL PROTECTED]</email>
  <image>http://images.vnunet.com/authors/pier_fumagalli.jpg</image>
</author>

To do so in the way you describe, I (Pier Fumagalli), will have to change
the data "fed" into the template, so that it'll become something like:

<article number="100">
  <author>
    <name>Pier Fumagalli</name>
    <email>[EMAIL PROTECTED]</email>
    <image>http://images.vnunet.com/authors/pier_fumagalli.jpg</image>
  </author>
  <title>Apache Cocoon 2.1 sees the light of a release</title>
  <body>
    [...]
  </body>
</article>

This won't happen for each article, indeed, only for a subset of them, so,
literally, I'll aggregate that content only when required, not in all cases.
But I have to set up content aggregation (my graphic team knows only HTML),
and they'll work on a new template.

If, instead, I were able to do content aggregation directly on the view,
well, then that would be _MARVELOUS_, because I won't have to prepare any
extended dataset when the editorial team decides that they want some extra
information on the page, right? Editorial talks to graphic, and development
flies straight out of the picture...

So, yes, the view should be "pushed" data (in term that it should not
control its generation), but at the same time the view should be able to
"aggregate" different data sources, because I (who manage the data), don't
want to know ANYTHING about what the graphic and editorial team wants to
display to our visitors...

(Now bracing for the first flame)

> [...]
> IMHO, the template language which is closer to the optimum is XSLT

The problem I see that I see with XSLT is that XSLT is an transformation
language, not a templating engine (templating, in my vocabulary, means "fill
in the blanks" kind of thing).

Again, my graphic team knows only HTML, they don't want to think about how
the data is organized in the back, they could care less (as I could care
less about their CSSes). They want to design a page like

<HTML>
 <HEAD>
  <TITLE>The title goes here</TITLE>
 </HTML>
 <BODY>
  <H1>The title goes here</H1>
  <P>Author: The author name goes here</P>
  <HR/>
  The article body goes here
 </BODY>
</HTML>

Because they can see what they do in DreamWeaver, and once they're done and
they like it, they strip out all those nice "the xxx goes here" and replace
them with _something_ that actually polls the data and puts it in place...

<bracing reason="for flame #2">like with JSP tag libraries</bracing>

The problem I have is that somehow, they _know_ how to aggregate data, but
they don't want (or have the skill) to think how that would work a step
behind, so, how a pure-xml data aggregation solution would work (as outlined
above).

And if you think of pulling more and more data sources into the same view,
the whole thing becomes more and more complicated... If you assume that (for
example) for each one of our articles we have a set of related articles
like:

<related to="100">
  <articleref id="101">
    <title>The Cocoon developers say "this is the way to go mate"</title>
  </articleref>
  <articleref id="102">
     <title>Stefano's  quest for the perfect template language</title>
  </articleref>
</related>

And more and more and more...

                                      -O-

So, at the end of the day, the easiest solution (with our current skills) is
to use something like XSPs (but sometimes the syntax might be a little
cumbersome), and to create a set of tag libraries to access the different
data sources (and then my pipeline would collapse to a XSP generator and an
HTML serializer)...

                                      -O-

But if you asked me about the "perfect template language", it would be a
some sort of "content aggregator with XPath" generator, where, given the
following sitemap:

<map:match pattern="/news/*">
  <map:generate src="/templates/news.tmpl"/>
    <map:parameter name="source" value="cocoon:/data/articles/{1}"/>
    <map:parameter name="topnews" value="cocoon:/data/lists/topnews"/>
  </map:generate>
  <map:serialize/>
</map:match>

I could write something like:

<HTML template:article="source:/article">
  <HEAD>
     <TITLE>{article:title}</TITLE>
   </HEAD>
   <BODY>
     <H1>{article:title}</H1>
     <P tmpl:author="{cocoon:/data/authors/[EMAIL PROTECTED]/author">
       Author: 
       <A href="mailto:{author:email}";>{author:name}</A>
     </P>
     {article:body}
     <DL>
       <DT>Other top news from us</DT>
       <template:foreach context="topnews:/related/articleref";>
         <DL>
           <A href="/news/{context:@id}">{context:title}</A>
         </DL>
       </template:foreach>
   </BODY>
</HTML>

That at the end of the day, could generate the following output:

<HTML>
  <HEAD>
     <TITLE>Apache Cocoon 2.1 sees the light of a release</TITLE>
   </HEAD>
   <BODY>
     <H1>Apache Cocoon 2.1 sees the light of a release</H1>
     <P>
       Author:
       <A href="mailto:[EMAIL PROTECTED]">Pier Fumagalli</A>
     </P>

     <p>
       The Apache Cocoon team announced today that the new release
       of their <b>Cocoon</b> publishing engine is ready for prime
       time.
     </p>
     <p>
       To get more info see the <a href="http://cocoon.apache.org";>
       Apache Cocoon Web Site</a>.
     </p>

     <DL>
       <DT>Other top news from us</DT>
       <DL>
         <A href="/news/101">
           The Cocoon developers say "this is the way to go mate"
         </A>
         <A href="/news/102">
           Stefano's  quest for the perfect template language
         </A>
       </DL>
   </BODY>
</HTML>

... I don't know... Maybe I don't make sense myself, but I'm troubled as I
know that my graphic team won't pick up XSLT and won't think about the data
structures, and without that, right now, it's quite hard to get all the
other advantages of cocoon...

    Pier
     



Reply via email to