cocoon-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Conal Tuohy" <con...@paradise.net.nz>
Subject HOWTO: Serving static XML files a la Cocoon-1
Date Sun, 28 Apr 2002 23:49:31 GMT
Hi Peter,

Here's one way to respect processing instructions in Cocoon2:

Create a pipeline which reads an xml doc, finds the PI element and returns
the contents of the xsl document which it specifies. I've called this
"get-stylesheet.xsl", since it returns the stylesheet for a document. It
will return different stylesheets depending on the source document.

Create a separate pipeline which reads an xml doc and transforms it using
the stylesheet returned by the first pipeline.

I've done a little example, which I enclose. It is pretty basic - it assumes
all stylesheets are in the same folder, assumes they all produce html, and
it handles only 1 PI per source document, which it assumes refers to an XSL
stylesheet, but it's simple and you can easily modify it to suit a more
complicated setup if necessary.

The source documents (example/documents/*.xml) are assumed to contain a PI
like the one below:

<?xml-stylesheet href="hello.xsl" type="text/xsl"?>

The hello.xsl file is assumed to be in the example/stylesheets folder.

The sitemap snippet defines the 2 pipelines:

<map:match pattern="get-stylesheet-for/*.xml">
  <map:generate src="example/documents/{1}.xml"/>
  <map:transform src="example/stylesheets/get-stylesheet.xsl"/>
  <map:serialize type="xml"/>
</map:match>

<map:match pattern="test/*.html">
  <map:generate src="example/documents/{1}.xml"/>
  <map:transform src="cocoon://get-stylesheet-for/{1}.xml"/>
  <map:serialize type="html"/>
</map:match>


The stylesheet "get-stylesheet.xsl":
---------------------------------------------------------
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- copy contents of the PI's href -->
  <xsl:template match="processing-instruction()">
    <xsl:variable name="stylesheet"
      select="substring-before(substring-after(.,'href=&quot;'),'&quot;')"
    />
    <xsl:apply-templates mode="copy" select="document($stylesheet)"/>
  </xsl:template>

  <!-- ignore the rest of the document -->
  <xsl:template match="@*|*"/>

  <!-- for copying the stylesheet referred to by the PI -->
  <xsl:template match="@*|node()" mode="copy">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" mode="copy"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
---------------------------------------------------------

The

> -----Original Message-----
> From: Peter Flynn [mailto:pflynn@imbolc.ucc.ie]
> Sent: Monday, 29 April 2002 01:45
> To: cocoon-users@xml.apache.org
> Subject: Re: Serving static XML files a la Cocoon-1
>
>
> > Key distinction:
> >
> > DTDs are used to *VALIDATE*, not render.
>
> That's one reason. The other is to allow the document to be edited in
> a structured editor. Our documents are all created by humans, so we
> need to use a system which guides creation and editing. The Document
> Type Declaration is therefore present in the XML file so that the
> type of document can be detected by software (whether or not the DTD
> is used). The root element type name is insufficient for this (too
> many DTDs for articles use the root element type <article> already :-)
>
> > True, but it is not uncomon to have a working stylsheet in
> > applications, and before release the web monkeys are let loose to
> > make it look nice.  Of course both these developments can be
> > happening simultaneously.  THe doc writer should not care how the
> > info is presented, that isn't their concern.
>
> This is a contentious point. Frequently the doc writer is the only one
> who knows how the information should be presented: document stylists
> are notoriously ignorant of technical matters, just as authors are
> notoriously ignorant of typographic matters.
>
> > >>The sample sitemap bundled with Cocoon offers these
> 'defaults' already.
> > >
> > > If that is so, why does it not transform my sample XML
> document with
> > > its accompanying XSL stylesheet?
> >
> > Are you volunteering to write something that reacts to PIs?
>
> :-) Done too many of them already.
>
> > It's not really a trivial task, and considering the amount of work
> > involved in it, for something we really don't want to encourage,
> > its not a likely thing to happen soon.
>
> No, I don't want to if I can avoid it. PIs should be kept for their
> real task: affecting processing *outside* the domain of the processor
> (think TeX/dvi \specials). Basically tweaks.
>
> > Going back to your "associated" XSL document, and
> distributing the files
> > w/o a server: you can still do that with your PIs.  A
> browser that knows
> > how to treat the PIs will do so correctly.  However, for
> serving up to
> > older browsers, you should use the preferred method.  Your
> Sitemap won't
> > change much.  You stated something like every few years.  When you
> > change your site, you only need to update the sitemap to
> point to the
> > new stylesheet--even if you have hundreds of documents by then.
>
> I still need to bind a stylesheet to the documents. The Document Type
> is the obvious key, but I can't see how to achieve this in
> sitemap.xmap
>
> ///Peter
>
> ---------------------------------------------------------------------
> Please check that your question has not already been answered in the
> FAQ before posting. <http://xml.apache.org/cocoon/faqs.html>
>
> To unsubscribe, e-mail: <cocoon-users-unsubscribe@xml.apache.org>
> For additional commands, e-mail: <cocoon-users-help@xml.apache.org>
>
>


---------------------------------------------------------------------
Please check that your question has not already been answered in the
FAQ before posting. <http://xml.apache.org/cocoon/faqs.html>

To unsubscribe, e-mail: <cocoon-users-unsubscribe@xml.apache.org>
For additional commands, e-mail: <cocoon-users-help@xml.apache.org>


Mime
View raw message