Re: Passing a "callback" name to ixsl:schedule-action
Øyvind Gjesdal <[email protected]>
| Newsgroups | gmane.text.xml.saxon.help |
|---|---|
| Message-ID | <CAOB384YC_=U++E4DzLrdyfr8nKjSUkStOhgVHoLkVf=6TXOroQ@mail.gmail.com> |
I wonder if it is because the 'xsl:message' is not inside a result-document fragment (using an id fragment from the input.html such as 'test' on button element ). From the documentation ( https://www.saxonica.com/saxon-js/documentation/index.html#!ixsl-extension/instructions/schedule-action ): Note that ixsl:schedule-action does not write the value returned by the contained xsl:call-template instruction to the current result tree. In practice therefore, the only useful thing that the called template can do is to issue an xsl:result-document instruction (or similar instructions with side-effects, such as ixsl:set-attribute). Does this work? <xsl:function name="ac:test"> <xsl:param name="response" as="map(*)"/> <!-- default mode for result-document is append, only console message should be added--> <xsl:result-document href="#test"> <xsl:message>RESPONSE STATUS: <xsl:value-of select="$response?status"/></xsl :message> <xsl:call-template name="another-template"/> </xsl:result-document> </xsl:function> Kind regards, Øyvind lør. 29. aug. 2020 kl. 16:26 skrev Martynas Jusevičius < martynas-tyFqBaoSXPC1Z/[email protected]>: > I've created a minimal case which still exhibits the "Internal error: > Target component not found (slot=0 id=NaN)" error: > > https://namedgraph.github.io/saxon-js2-test/ > Source: https://github.com/namedgraph/saxon-js2-test/tree/gh-pages > > On Fri, Aug 28, 2020 at 4:38 PM Michael Kay <mike-JkSD5nQpfvpWk0Htik3J/[email protected]> wrote: > > > > It should be possible. "Target component not found" tends to suggest an > internal error. > > > > Michael Kay > > Saxonica > > > > On 28 Aug 2020, at 14:34, Martynas Jusevičius <[email protected]> > wrote: > > > > OK, got it. > > > > Can I use <xsl:call-template> from within such a function? The > > following one gives me the "Target component not found" error > > > > <xsl:function name="apl:resource-typeahead-callback"> > > <xsl:param name="element" as="element()"/> > > <xsl:param name="container-uri" as="xs:anyURI"/> > > <xsl:param name="response" as="map(*)"/> > > > > <xsl:choose> > > <xsl:when test="$response?status = 200"> > > <xsl:for-each select="$response?body"> > > <xsl:call-template name="typeahead:process"> > > <xsl:with-param name="menu" select="$menu"/> > > <xsl:with-param name="items" > > select="rdf:RDF/*[@rdf:about[not(. = > > > $container-uri)]][not(core:stateOf)][not(core:viewOf)][not(dh:pageOf)][not(ldt:paramName)]"/> > > <xsl:with-param name="element" select="$element"/> > > <xsl:with-param name="name" select="'ou'"/> > > </xsl:call-template> > > </xsl:for-each> > > </xsl:when> > > <xsl:otherwise> > > <xsl:value-of select="ixsl:call(ixsl:window(), > > 'alert', [ $response?message ])"/> > > </xsl:otherwise> > > </xsl:choose> > > </xsl:function> > > > > No error if I comment out the <xsl:call-template>. > > > > Do I now need to turn all the named templates in the library into > functions? > > > > On Fri, Aug 28, 2020 at 12:35 PM Michael Kay <mike-JkSD5nQpfvpWk0Htik3J/[email protected]> wrote: > > > > > > <xsl:variable name="callback" > select="apl:resource-typeahead-callback#0"/> > > > > if it has 0 parameters, apl:resource-typeahead-callback#1 if it has one > parameter, etc. > > > > A global function (declared with xsl:function) won't have any data in > its closure. If you want to capture state in the function, you need an > anonymous function: > > > > <xsl:variable name="someData" select="doc('abc.xml')//something"/> > > <xsl:variable name="callback" > select="function(){my:do-something-with($someData)}"/> > > > > Here the value of $someData is "remembered" by the function object (in > its "closure") and can therefore be referenced later, when the function is > executed (i.e. in your case, when the HTTP request is completed). > > > > This doesn't play well with mutable objects, so try to avoid holding > references to the HTML page in the closure. > > > > Michael Kay > > Saxonica > > > > On 28 Aug 2020, at 11:23, Martynas Jusevičius <[email protected]> > wrote: > > > > Thanks. I'm not yet familiar with higher-order functions in XSLT. > > > > Lets say I want to use <xsl:function > > name="apl:resource-typeahead-callback"> as the callback -- how do I > > supply it as $callback? > > > > On Fri, Aug 28, 2020 at 11:23 AM Michael Kay <mike-JkSD5nQpfvpWk0Htik3J/[email protected]> wrote: > > > > > > This is very much in the whole area of my Balisage 2020 paper an > Asynchronous XSLT, and of course that describes the limitations of the > current design which this use case illustrates well. > > > > You're constrained to invoke a statically-known template within > ixsl:schedule-action, but the parameters to that template can include a > function item which is invoked dynamically. So you can do something like > > > > <ixsl:schedule-action http-request="...."> > > <xsl:call-template name="http-completion"> > > <xsl:with-param name="action" as="function(*)" select="$callback"/> > > </xsl:call-template> > > </ixsl:schedule-action> > > > > <xsl:template name="http-completion"> > > <xsl:param name="action" as="function(*)"/> > > <xsl:sequence select="$action()"/> > > </xsl:template> > > > > Michael Kay > > Saxonica > > > > On 28 Aug 2020, at 10:13, Martynas Jusevičius <[email protected]> > wrote: > > > > Hi, > > > > with Saxon-CE I've used a typeahead "library" which would accept both > > the JS function to be called and the callback as params: > > > > <!-- caller --> > > > > <xsl:call-template name="typeahead:load-xml"> > > <xsl:with-param name="element" select="."/> > > <xsl:with-param name="query" select="$text"/> > > <xsl:with-param name="uri" select="$results-uri"/> > > <xsl:with-param name="js-function" select="$js-function"/> > > <xsl:with-param name="callback" select="ixsl:get(ixsl:window(), > > 'onresourceTypeaheadCallback')"/> > > </xsl:call-template> > > > > <!-- library --> > > > > <xsl:template name="typeahead:load-xml"> > > <xsl:param name="element" as="element()"/> > > <xsl:param name="uri" as="xs:anyURI"/> > > <xsl:param name="query" as="xs:string"/> > > <xsl:param name="js-function" as="xs:string"/> > > <xsl:param name="callback"/> > > <!-- if the value hasn't changed during the delay --> > > <xsl:if test="$query = $element/ixsl:get(., 'value')"> > > <xsl:value-of select="ixsl:call(ixsl:window(), $js-function, [ > > ixsl:event(), $uri, $callback ])"/> > > </xsl:if> > > </xsl:template> > > > > Now I want to replace all custom HTTP-related functions with > > <ixsl:schedule-action http-request="">. So I picture something like > > this: > > > > <xsl:template name="typeahead:load-xml"> > > <xsl:param name="element" as="element()"/> > > <xsl:param name="uri" as="xs:anyURI"/> > > <xsl:param name="query" as="xs:string"/> > > <!-- if the value hasn't changed during the delay --> > > <xsl:if test="$query = $element/ixsl:get(., 'value')"> > > <xsl:schedule-action http-request="map{ 'method': 'GET', > > 'href': $uri, 'headers': map{ 'Accept': 'application/rdf+xml' } }"> > > <xsl:call-template name="?????????"/> > > </ixsl:schedule action> > > </xsl:if> > > </xsl:template> > > > > So <xsl:call-template> functions like a callback here, but I cannot > > pass template name as a param. Of course I could hardcode some name > > like "typeahead:xml-loaded", but I would prefer not doing that. > > > > Is there an idiomatic Saxon-JS solution to this? > > > > > > _______________________________________________ > > saxon-help mailing list archived at http://saxon.markmail.org/ > > [email protected] > > https://lists.sourceforge.net/lists/listinfo/saxon-help > > > > > > _______________________________________________ > > saxon-help mailing list archived at http://saxon.markmail.org/ > > [email protected] > > https://lists.sourceforge.net/lists/listinfo/saxon-help > > > > > > > > _______________________________________________ > > saxon-help mailing list archived at http://saxon.markmail.org/ > > [email protected] > > https://lists.sourceforge.net/lists/listinfo/saxon-help > > > > > > _______________________________________________ > > saxon-help mailing list archived at http://saxon.markmail.org/ > > [email protected] > > https://lists.sourceforge.net/lists/listinfo/saxon-help > > > > > > > > _______________________________________________ > > saxon-help mailing list archived at http://saxon.markmail.org/ > > [email protected] > > https://lists.sourceforge.net/lists/listinfo/saxon-help > > > > > > _______________________________________________ > > saxon-help mailing list archived at http://saxon.markmail.org/ > > [email protected] > > https://lists.sourceforge.net/lists/listinfo/saxon-help > > > _______________________________________________ > saxon-help mailing list archived at http://saxon.markmail.org/ > [email protected] > https://lists.sourceforge.net/lists/listinfo/saxon-help _______________________________________________ saxon-help mailing list archived at http://saxon.markmail.org/ [email protected] https://lists.sourceforge.net/lists/listinfo/saxon-help