- From: Martin Honnen <martin.honnen@gmx.de>
- Date: Thu, 8 Jul 2021 20:37:10 +0200
- To: xproc-dev@w3.org
On 08.07.2021 13:37, Martin Honnen wrote: > XSLT 3 basically allows three ways to use a stylesheet, apply-templates > with an initial mode, call-template with an initial template or invoking > a public function with arguments > (https://www.w3.org/TR/xslt-30/#invoking-initial-function). > > p:xslt in XProc 3 with the options for initial mode or template-name > seems to only cater for apply-templates or call-template, but I miss a > way there to call a public function. So I hacked one, writing a library https://github.com/martin-honnen/martin-honnen.github.io/blob/master/XProc3/libraries/call-function-in-XSLT-lib.xpl which does <p:library xmlns:p="http://www.w3.org/ns/xproc" version="3.0" xmlns:mf="http://example.com/mf" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <p:declare-step type="mf:call-function"> <p:option name="xslt-lib-uri" as="xs:anyURI" required="true"/> <p:option name="function-name" as="xs:QName" required="true"/> <p:option name="function-arity" as="xs:integer" required="true"/> <p:option name="function-arguments" as="array(*)" select="[]"/> <p:input port="source"/> <p:output port="result" sequence="true"/> <p:xslt version="3.0" template-name="xsl:initial-template" parameters="map { 'function-name' : $function-name, 'function-arity' : $function-arity, 'function-arguments' : $function-arguments }" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <p:with-input port="stylesheet"> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mf="http://example.com/mf" exclude-result-prefixes="#all"> <xsl:import href="{$xslt-lib-uri}"/> <xsl:param name="function-name" as="xs:QName" required="yes"/> <xsl:param name="function-arity" as="xs:integer" required="yes"/> <xsl:param name="function-arguments" as="array(*)" select="[]"/> <xsl:output build-tree="no"/> <xsl:template name="xsl:initial-template"> <xsl:sequence select="function-lookup($function-name, $function-arity) => apply($function-arguments)"/> </xsl:template> </xsl:stylesheet> </p:with-input> </p:xslt> </p:declare-step> </p:library> and can then be used as in https://github.com/martin-honnen/martin-honnen.github.io/blob/master/XProc3/call-XSLT-function-test.xpl, doing e.g. <p:declare-step xmlns:p="http://www.w3.org/ns/xproc" version="3.0" xmlns:mf="http://example.com/mf"> <p:import href="libraries/call-function-in-XSLT-lib.xpl"/> <p:input port="source"/> <p:output port="result" sequence="true" serialization="map { 'method' : 'json' }"/> <mf:call-function xslt-lib-uri="../../xslt/generic-positional-grouping-functions.xsl" function-name="mf:group-into-sequence-of-arrays" function-arity="2" function-arguments="[/root/item, 3]"/> </p:declare-step>
Received on Thursday, 8 July 2021 18:38:25 UTC