You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by Shane Curcuru/CAM/Lotus <sh...@us.ibm.com> on 2002/09/17 14:56:48 UTC
FWD: Xalan's usage of BSF language engines, please help clarify ...
Not ackd.
As usual, the appropriate place to ask Xalan questions is on one of the
*Xalan* team mailing lists, either xalan-dev@xml.apache.org (where I'm
forwarding this for you) or xalan-j-users@xml.apache.org. Information
about subscribing to these lists or viewing the archives is at
http://xml.apache.org/mail.html Contacting individual developers is a Bad
Idea, unless you happen to know them personally, especially when they
haven't had enough coffee in the morning.
----- Forwarded by Shane Curcuru on 09/17/2002 08:53 AM -----
From: "Rony G. Flatscher" <Ro...@wu-wien.ac.at>
To: scott_boag@us.ibm.com, Shane_Curcuru@us.ibm.com, Paul_Dick@us.ibm.com,
keshlam@us.ibm.com, donald_leslie@us.ibm.com, David_Marston@us.ibm.com,
myriam_midy@us.ibm.com, cmanolache@yahoo.com, garyp@firstech.com,
mkwan@ca.ibm.com, ilene@ca.ibm.com, zongaro@ca.ibm.com
Hi there,
in the context of experimenting with XSL-extensions, implementing them with
a non-Java-language,
i.e. a self-developed RexxEngine (supporting IBM's Object Rexx on Linux,
OS/2, Windows, and the
opensource Rexx interpreter "Regina" on Linux and Windows), I had a student
experiment with
extensions.
The problem: what works with JavaScript does not work with Rexx (the
JavaScript extension example is
enclosed, the JavaScript part should get replaced with a Rexx program as a
proof of concept). The
RexxEngine extends BSFEngineImpl, is loaded and call() is invoked.
Unfortunately, the method call()
does not receive the source-code (i.e. the Rexx code) but only the name of
the function and the
arguments.
The question: how would one be able to get a hold of the source code at
runtime? (Where is the
program source of the script located?)
Any hint would be highly appreciated!
---
[With eval(), exec() and apply() all the arguments are more clearly defined
compared to call().
Actually, I would have expected that apply() would be invoked instead of
call(). call() is obviously
meant for invoking a given method on a known object in the target scripting
environment, hence my
surprise that call() is used within the Xalan extension mechanism and not
apply().]
Also, please do not be offended, if I address all of you, who are known to
be Xalan-implementors.
It's just a sign of the high level of despair (due to strong
time-restrictions and work-overload)
and the hope that maybe one of you may be able to anwer this quickly and
without too much effort.
(The student, a non-Informatic student, has been trying for three months
to solve the problem, I
started two weeks ago to look into it and started out studying the e-mail
archives of cocoon and
posted questions there to no avail, now concentrating on Xalan, but have
not found any information
on this. The BSF-discussion list was not used yet, because its posting
intensity is very low and I
would not expect any help from there.)
Thank you very much for *any* hint/help in advance !
Regards,
Rony G. Flatscher
<?xml-stylesheet type="text/xsl">
XML nach HTML
Dies ist das Ergebnis der Transformation einer XML-Seite in das HTML-Format
Die Differenz beträgt zwischen dem Tag der Abgabe: Sun Jun 30 2002
00:00:00 GMT+0200 (CEST) und heutigem Tage: Tue Jul 30 2002 00:34:36
GMT+0200 (CEST) 30 Tage und wird daher nicht mehr toleriert.<?xml
version="1.0"?>
<!DOCTYPE page [
<!ELEMENT page (title?, content)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT content (para+)>
<!ELEMENT para (#PCDATA)>
]>
<?xml-stylesheet type="text/xsl"?>
<page>
<title>XML nach HTML</title>
<content>
<para>Dies ist das Ergebnis der Transformation
einer XML-Seite in das HTML-Format</para>
<deadline duedate="June 30, 2002"/>
</content>
</page>
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:lxslt="http://xml.apache.org/xslt"
xmlns:my-ext="ext1"
extension-element-prefixes="my-ext">
<xsl:param name="view-source"/>
<xsl:template match="page">
<html>
<head>
<title>
<xsl:value-of select="title"/>
</title>
</head>
<body bgcolor="white" alink="red" link="blue" vlink="blue">
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="title">
<h2 style="color: navy; text-align: center">
<xsl:if test="not($view-source)">
<xsl:apply-templates/>
</xsl:if>
<xsl:if test="$view-source">
<A>
<xsl:attribute name="HREF">../view-source?filename=/<xsl:value-of
select="$view-source"/></xsl:attribute>
<xsl:attribute
name="TARGET">_blank</xsl:attribute>
<xsl:apply-templates/>
</A>
</xsl:if>
</h2>
</xsl:template>
<xsl:template match="para">
<p align="left">
<i><xsl:apply-templates/></i>
</p>
</xsl:template>
<xsl:template match="@*|node()"
priority="-2"><xsl:copy><xsl:apply-templates
select="@*|node()"/></xsl:copy></xsl:template>
<!--The component and its script are in the lxslt namespace and define the
implementation of the extension. -->
<lxslt:component prefix="my-ext" elements="timelapse"
functions="getdate">
<lxslt:script lang="javascript" >
<![CDATA[
function getdate(duedate)
{
var date = new Date(duedate);
var now = new Date();
var diff = now.getTime() - date.getTime();
var days = Math.floor(diff / (1000 * 60 * 60 * 24));
if (days < 7) {
var data = "Die Differenz beträgt zwischen dem Tag der Abgabe:
" + date + " und heutigem Tage: " + now + " " + days + " Tage und wird
daher noch toleriert.";
return data;
}
else if (days > 7) {
var data = "Die Differenz beträgt zwischen dem Tag der Abgabe: "
+ date + " und heutigem Tage: " + now + " " + days + " Tage und wird daher
nicht mehr toleriert.";
return data;
}
else if (days == 7) {
var data = "Die Differenz beträgt zwischen dem Tag der Abgabe: "
+ date + " und heutigem Tage: " + now + " genau " + days + " Tage und wird
daher gerade noch toleriert.";
return data;
}
else {
var data = "It's already done!";
return data;
}
}]]>
</lxslt:script>
</lxslt:component>
<xsl:template match="deadline">
<p>
<xsl:value-of select="my-ext:getdate(string(@duedate))"/> </p>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:lxslt="http://xml.apache.org/xslt"
xmlns:my-ext="ext1"
extension-element-prefixes="my-ext">
<xsl:param name="view-source"/>
<xsl:template match="page">
<html>
<head>
<title>
<xsl:value-of select="title"/>
</title>
</head>
<body bgcolor="red" alink="red" link="blue" vlink="blue">
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="title">
<h2 style="color: navy; text-align: center">
<xsl:if test="not($view-source)">
<xsl:apply-templates/>
</xsl:if>
<xsl:if test="$view-source">
<A>
<xsl:attribute name="HREF">../view-source?filename=/<xsl:value-of
select="$view-source"/></xsl:attribute>
<xsl:attribute
name="TARGET">_blank</xsl:attribute>
<xsl:apply-templates/>
</A>
</xsl:if>
</h2>
</xsl:template>
<xsl:template match="para">
<p align="left">
<i><xsl:apply-templates/></i>
</p>
</xsl:template>
<xsl:template match="@*|node()"
priority="-2"><xsl:copy><xsl:apply-templates
select="@*|node()"/></xsl:copy></xsl:template>
<!--The component and its script are in the lxslt namespace and define the
implementation of the extension.-->
<lxslt:component prefix="my-ext" elements="timelapse"
functions="calctime">
<lxslt:script lang="rexx">
<![CDATA[
/* calctime rexx - Object Rexx, ---rgf, 2002-07-30, 03:03, wuw */
parse arg mon +3 . day "," year /* parse date */
due_date = date("s", space(day mon year), "n") /* convert to a sortable
date */
due_days = date("b", due_date, "s") /* convert to days since
0001-01-01 */
today = date("l") /* get today in a
sortable date */
today_days = date("b") /* convert to days since
0001-01-01 */
days=today_days-due_days /* calc difference of
days */
due_date = date("L", due_date, "s") /* convert to language
format */
if days<7 then
return ("Die Differenz beträgt zwischen dem Tag der Abgabe:" due_date
"und heutigem Tage:" today days "Tage und wird daher noch toleriert.")
else if days=7 then
return "Die Differenz beträgt zwischen dem Tag der Abgabe:" due_date
"und heutigem Tage:" today days "Tage und wird daher gerade noch
toleriert."
else /* nur mehr der Fall möglich, dass "days>7" ist ! */
return ("Die Differenz beträgt zwischen dem Tag der Abgabe:" due_date
"und heutigem Tage:" today days "Tage und wird daher nicht mehr
toleriert.")
]]>
</lxslt:script>
</lxslt:component>
<xsl:template match="deadline">
<xsl:value-of select="my-ext:calctime(string(@due_date))"/>
</xsl:template>
</xsl:stylesheet>