- From: Imsieke, Gerrit, le-tex <gerrit.imsieke@le-tex.de>
- Date: Thu, 17 Apr 2014 07:56:06 +0200
- To: xproc-dev@w3.org
Hi Graham,
There's a port called 'error' in the p:catch branch [1]. You need to
forward this port to some other port that you declare both for the
p:group and for the p:catch branch. In the example below, I added a
'status' port to the pipeline where there will either be an <ok/>
document or the forwarded error port of p:catch. It's a bit verbose,
admittedly, but that's how XProc is sometimes.
Gerrit
[1] http://www.w3.org/TR/xproc/#p.catch
<p:declare-step
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:p="http://www.w3.org/ns/xproc"
version="1.0">
<p:input port="source" primary="true">
<p:inline>
<doc>Hello World!</doc>
</p:inline>
</p:input>
<p:output port="result" primary="true"/>
<p:output port="status">
<p:pipe port="status" step="try-test"/>
</p:output>
<p:option name="terminate" required="false" select="'yes'"/>
<p:try name="try-test">
<p:group>
<p:output port="status">
<p:inline>
<ok/>
</p:inline>
</p:output>
<p:output port="result" primary="true"/>
<p:xslt name="tester">
<p:with-param name="terminate" select="$terminate" />
<p:input port="stylesheet">
<p:inline>
<xsl:stylesheet version="2.0">
<xsl:param name="terminate" as="xs:string"/>
<xsl:template match="/">
<xsl:message terminate="{$terminate}">in XSLT step
named 'tester'</xsl:message>
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
</p:inline>
</p:input>
<p:input port="parameters">
<p:empty/>
</p:input>
</p:xslt>
</p:group>
<p:catch name="catch">
<p:output port="status">
<p:pipe port="result" step="forward-errors"/>
</p:output>
<p:output port="result" primary="true">
<p:inline>
<nodoc/>
</p:inline>
</p:output>
<p:identity name="forward-errors">
<p:input port="source">
<p:pipe port="error" step="catch"/>
</p:input>
</p:identity>
<p:sink/>
</p:catch>
</p:try>
</p:declare-step>
On 16.04.2014 17:27, Graham Seaman wrote:
> Thanks Jonathan,
>
> That's a really helpful resource, and has cleared up a lot of my
> questions about the operation of ports. Unfortunately the try/catch
> examples generate an inline output in the catch sections, rather than
> trying to access the error which made the try fail, as I'm trying to do.
>
> The following example now at least runs (using the same xml/xslt as
> before). However, while a successful 'try' correctly outputs the xslt
> transform output, when it fails because the xslt has terminated with an
> xsl:message, the catch section simply reproduces the original input. I
> still can't work out how to connect the catch input to the xslt error
> message, instead of to the initial input.
>
> <?xml version="1.0" encoding="UTF-8"?>
>
> <p:declare-step xmlns:p="http://www.w3.org/ns/xproc" version="1.0">
> <p:input port="source" primary="true">
> <p:document href="test.xml"/>
> </p:input>
> <p:output port="result" primary="true" sequence="false"/>
>
> <p:try name="try-test">
> <p:group>
> <p:xslt name="tester">
> <p:input port="stylesheet">
> <p:document href="test.xslt"/>
> </p:input>
> <p:input port="parameters" sequence="true">
> <p:empty/>
> </p:input>
> </p:xslt>
> </p:group>
> <p:catch>
> <p:filter select="/"/>
> </p:catch>
> </p:try>
>
> </p:declare-step>
>
> Graham
>
> On 15/04/14 21:58, Cranford, Jonathan W. wrote:
>> Graham,
>>
>> There's an example of try..catch embedded in the XProc tutorial at http://xfront.com/xproc/index.html, by Roger Costello and James Garriss.
>>
>> Look specifically at xproc/labs/lab09_try_catch in the zip file.
>>
>> This is a really good resource that was invaluable to me when first learning XProc.
>>
>> HTH,
>>
>> Jonathan Cranford
>>
>>
>>> -----Original Message-----
>>> From: Graham Seaman [mailto:graham@theseamans.net]
>>> Sent: Tuesday, April 15, 2014 4:48 AM
>>> To: xproc-dev@w3.org
>>> Subject: try/catch with messages
>>>
>>> Hi,
>>>
>>> I'm in the 'initial 5 minutes' stage of learning xproc, and floundering.
>>> I have a series of xslt templates intended to validate files in
>>> different ways. If validation fails at any point, the xslt terminates
>>> with an error message (ie. using xsl;message with terminate='yes'). I'm
>>> hoping to persuade xproc to catch and display the message produced in
>>> the xslt, and would ideally like the xproc pipeline also to terminate at
>>> that point. However, I haven't even been able to get try/catch working
>>> yet. Below is a (clearly non-working) attempt with some toy xml/xslt. I
>>> think in general the biggest problem I'm having is with the scope of the
>>> various ports (for example, I don't understand why the global pipeline
>>> source port is not visible to the p:xslt stage without adding a 'dummy'
>>> parameter).
>>>
>>> Thanks for any advice
>>>
>>> Graham
>>>
>>>
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>>
>>> <p:declare-step xmlns:p="http://www.w3.org/ns/xproc" version="1.0">
>>> <p:input port="source" primary="true" sequence="false">
>>> <p:document href="test.xml"/>
>>> </p:input>
>>> <p:output port="result" primary="true" sequence="false"/>
>>>
>>> <p:try name="try-test">
>>> <p:group>
>>> <p:xslt name="tester">
>>> <p:input port="stylesheet">
>>> <p:document href="test.xslt"/>
>>> </p:input>
>>> <p:with-param name="dummy" select="''"/>
>>> </p:xslt>
>>> </p:group>
>>> <p:catch>
>>> <p:identity>
>>> <p:input port="source">
>>> <p:pipe step="tester" port="error"/>
>>> </p:input>
>>> </p:identity>
>>> </p:catch>
>>> </p:try>
>>>
>>> <p:identity>
>>> <p:input port="source">
>>> <p:pipe step="try-test" port="result"/>
>>> </p:input>
>>> </p:identity>
>>>
>>> </p:declare-step>
>>>
>>> -------------------
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>>
>>> <words>
>>> <phrase>Hallo world</phrase>
>>> <phrase>and it's goodbye from me</phrase>
>>> </words>
>>>
>>> -----------------------
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <xsl:stylesheet version="2.0"
>>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>>>
>>> <xsl:template match="@* | node()">
>>> <xsl:copy>
>>> <xsl:apply-templates select="@*, node()"/>
>>> </xsl:copy>
>>> </xsl:template>
>>>
>>> <xsl:template match="phrase">
>>> <xsl:if test="text() = 'and it''s goodbye from me'">
>>> <xsl:message terminate="yes">test.xml matched
>>> phrase</xsl:message>
>>> </xsl:if>
>>> <xsl:copy-of select="."/>
>>> </xsl:template>
>>> </xsl:stylesheet>
>>>
>>>
>>>
>>
>>
>
>
--
Gerrit Imsieke
Geschäftsführer / Managing Director
le-tex publishing services GmbH
Weissenfelser Str. 84, 04229 Leipzig, Germany
Phone +49 341 355356 110, Fax +49 341 355356 510
gerrit.imsieke@le-tex.de, http://www.le-tex.de
Registergericht / Commercial Register: Amtsgericht Leipzig
Registernummer / Registration Number: HRB 24930
Geschäftsführer: Gerrit Imsieke, Svea Jelonek,
Thomas Schmidt, Dr. Reinhard Vöckler
Received on Thursday, 17 April 2014 05:56:46 UTC