- From: Geert Josten <geert.josten@dayon.nl>
- Date: Wed, 31 Jul 2013 21:48:46 +0200
- To: Jostein Austvik Jacobsen <josteinaj@gmail.com>
- Cc: Norman Walsh <ndw@nwalsh.com>, XProc Dev <xproc-dev@w3.org>, Florent Georges <fgeorges@fgeorges.org>
- Message-ID: <3488404d579c30de44070c07f15b3e6b@mail.gmail.com>
Hi Jostein,
How close to what you had in mind would be something like this?
<p:declare-step type="my:if">
<p:input port="source" sequence="true"
primary="true"/>
<p:input port="parameters" kind="parameter"/>
<p:output port="result" primary="true"/>
<p:option name="test" required="true" />
<p:choose>
<p:when test="$test">
<p:apply-subpipeline />
</p:when>
<p:otherwise>
<p:identity/>
</p:otherwise>
</p:choose>
</p:declare-step>
<my:if>
<p:with-option name="test" select="xpath
test">
<p:pipe port="metadata"
step="load"/>
</p:with-option>
<p:add-attribute match="/*" attribute-name="something"
attribute-value="something"/>
</my:if>
Not as advanced as your suggestion, rather the stupid simplest I could come
up with close enough to at least look what you tried.. ;-)
Kind regards,
Geert
*Van:* Jostein Austvik Jacobsen [mailto:josteinaj@gmail.com]
*Verzonden:* woensdag 31 juli 2013 20:42
*Aan:* Florent Georges
*CC:* Norman Walsh; XProc Dev
*Onderwerp:* Re: custom non-atomic steps?
I'm not sure if I'm a fan of introducing a precompiler (I like to think of
this feature as higher order functions rather than macros, even though what
I outlined might be closer to a way to define macros). The XProc processor
needs to be able to throw a meaningful error with the filename and line
number of where the error occured.
Jostein
On 31 July 2013 18:14, Florent Georges <fgeorges@fgeorges.org> wrote:
On 30 July 2013 19:52, Norman Walsh wrote:
> Jostein Austvik Jacobsen writes:
Hi,
>> Has custom non-atomic steps (steps where you can provide one or more
>> subpipelines upon invocation) been discussed as a possibility in
>> XProc v.Next? It would for instance allow us to define our own
>> custom syntactic sugar.
> I don't think it's been discussed. It's not clear how to describe a
> custom step in a standard way.
If we are considering the "macro" approach, if we take the
initial example again:
<my:if test="...">
<my:xpath-context .../>
[ sub-pipeline ]
</my:if>
being equivalent to:
<p:choose>
<p:when test="...">
<px:xpath-context .../>
[ sub-pipeline ]
</p:when>
<p:otherwise>
<p:identity/>
</p:otherwise>
</p:choose>
What about the following?:
<p:declare-macro type="my:if">
<p:input port="source" primary="true"/>
<p:output port="result" primary="true"/>
<p:xslt>
<p:input port="stylesheet">
<p:inline>
<xsl:stylesheet version="2.0">
<xsl:template match="/my:if">
<a:choose>
<a:when>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</a:when>
<a:otherwise>
<a:identity/>
</a:otherwise>
</a:choose>
</xsl:template>
<xsl:template match="my:xpath-context">
<a:xpath-context>
<xsl:copy-of select="node()"/>
</a:xpath-context>
</xsl:template>
<xsl:template match="node()" priority="-1">
<xsl:message terminate="yes">
Unknown: <xsl:copy-of select="."/>
</xsl:message>
</xsl:template>
</xsl:stylesheet>
</p:inline>
</p:input>
<p:input port="parameters">
<p:empty/>
</p:input>
</p:xslt>
</p:declare-macro>
This defines a "step like", but which is evaluated at compile-
time (instead of at run-time), with the corresponding XML as input
(here the my:if element), and the result is inserted in the lexer
tree, replacing the initial "macro call". Here the macro is just
a stylesheet transforming the my:if into corresponding p:choose
(actually in an alias namespace, here bound to "a:").
Regards,
--
Florent Georges
http://fgeorges.org/
http://h2oconsulting.be/
Received on Wednesday, 31 July 2013 19:49:16 UTC