Re: Passing a "callback" name to ixsl:schedule-action
Martynas Jusevičius <martynas-tyFqBaoSXPC1Z/[email protected]>
| Newsgroups | gmane.text.xml.saxon.help |
|---|---|
| Message-ID | <CAE35Vmxy_V9s8gLFKx3JFRAwrCth2Ua=MQr1G6DGUjTqCk3gog@mail.gmail.com> |
Øyvind, I get "Cannot call xsl:result-document while evaluating function" with your example. On Sun, Aug 30, 2020 at 1:14 PM Øyvind Gjesdal <[email protected]> wrote: > 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 _______________________________________________ saxon-help mailing list archived at http://saxon.markmail.org/ [email protected] https://lists.sourceforge.net/lists/listinfo/saxon-help