That's it!! Simple! Now I wonder why I didn't try that.
One last glitch and I"m there. This is working except that its stripping the xhtml markup from $pageText. How to make it serialize the <page>...</page> content, processed by apply-templates, to a String while retaining all xhtml markup?
<xsl:template match="page">
<xsl:variable name="pageText">
#parse("vel/macros.vel")
#taskOpening("@ident")
<xsl:apply-templates select="*"/>
#taskClosing("@ident")
</xsl:variable>
<xsl:value-of select="task:addPage($task, string(@ident), string($pageText))" />
</xsl:template>
On Sunday, February 3, 2002, at 02:09 AM, Gary L Peskin wrote:
How about something like:
<xsl:template match="page">
<xsl:variable name="someName"> <xsl:apply-templates/> </xsl:variable>
<xsl:value-of select="task:addPage($task, string(@ident), $someName)">
</xsl:template>
The type of $someName should be an XRTreeFrag, I believe.
As far as the optional first argument, neither of those types is used for extension functions. These are for extension elements. You can specify an optional ExpressionContext as the first argument if you need any of its methods.
HTH, Gary
-----Original Message----- From: Brad Cox [mailto:[EMAIL PROTECTED] Sent: Saturday, February 02, 2002 7:20 PM To: [EMAIL PROTECTED] Cc: Brad Cox; Frank E. Weiss Subject: xalan extensions, cont'd.
More on the previously posted question. After considerable tinkering, the code is actually running, invoking the addPage(key, value) method on the task instance I passed as a parameter as intended.
The problem is that the value argument, as computed as "string(.)", isn't what I want. I want the value to be the result of <xsl:apply-templates/>, e.g. not the current node from the input, but the node after being transformed by the other templates in this file. I don't see how to do this. Can someone please help?
Here's the full xsl file I'm using:
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:lxslt="http://xml.apache.org/xslt" xmlns:java="http://xml.apache.org/xslt/java" xmlns:task="edu.virtualschool.model.Task" extension-element-prefixes="task" exclude-result-prefixes="java"
<xsl:output method="html"/> <xsl:param name="task"></xsl:param>
<xsl:template match="/task"> #parse("vel/macros.vel") #set($totalPages = <xsl:value-of select="count(page)"/>) #set($pageTitles = [<xsl:for-each select="page">"<xsl:value-of select="@ident"/>",</xsl:for-each>"Submit page"]) <xsl:apply-templates select="page"/> </xsl:template>
<xsl:template match="page"> <xsl:value-of select="task:addPage($task, string(@ident), string(.))" /> </xsl:template>
<xsl:template match="EmailQuestion|EssayQuestion|NameQuestion|UrlQuestion"> #<xsl:value-of select="name()"/>("<xsl:value-of select="@ident"/>" "<xsl:value-of select="normalize- space(text())"/>") </xsl:template>
<xsl:template match="MenuQuestion|RadioQuestion|CheckboxQuestion"> #<xsl:value-of select="name()"/>("<xsl:value-of select="@ident"/>" "<xsl:value-of select="normalize- space(text())"/>" [<xsl:for-each select="option">"<xsl:value-of select="."/>"<xsl:if test="not(position() = last())">,</xsl:if></xsl:for-each>]) </xsl:template>
<xsl:template match="*"> <xsl:copy-of select="."/> </xsl:template>
</xsl:stylesheet>
For completeness, the code that launches the transform (from Task.java)
TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(new StreamSource(xslFile.toString())); transformer.setParameter( "task", this ); StringWriter sw = new StringWriter(); transformer.transform( new StreamSource(xmlFile.toString()), new StreamResult(sw) ); System.err.println("out:"+sw); // printed and discarded this.xmlModified = xmlFile.lastModified(); this.dvslModified = dvslFile.lastModified();
And the addPage method (from Task.java). I don't understand the first two arguments; apparently they aren't needed/required/used based on it working after commenting them out.
public void addPage( // org.apache.xalan.extensions.XSLProcessorContext context, // org.apache.xalan.templates.ElemExtensionCall element, String ident, String body ) { String pageText = "#parse(\"vel/macros.vel\")\n"+ "#taskOpening(\""+ident+"\")\n"+ body+"\n"+ "#taskClosing(\""+ident+"\")\n"+ ""; System.err.println("addPage:"+pageText); pages.add(new Page(this, ident, pageText, new IntegerField(pages.size()))); }
Brad Cox, Ph.D.; [EMAIL PROTECTED] 703 361 4751 For industrial age goods there were checks and credit cards. For everything else there is http://virtualschool.edu/mybank Java Web Application Architecture: http://virtualschool.edu/jwaa
