- From: Knox, Douglas <dknox@wustl.edu>
- Date: Sat, 18 Jan 2025 15:48:46 +0000
- To: "xproc-dev@w3.org" <xproc-dev@w3.org>
Hi all,
I'm new to XProc and eager to use it to replace a rather complex shell-script driven sequence of XSLT calls. But I'm having trouble figuring out how to connect to the secondary port of a <p:choose> step.
There was a thread [1] on this list last March that I found helpful in getting the result port working, but the same technique that works for 'result' doesn't seem to apply to port 'secondary'.
As a toy example, I made myself a simple TEI document including a <div type="doc_a"> and a few short paragraphs. I made two XSLT stylesheets: process_a.xsl, which just adds @type='annotated' to every <p>, and process_b, which adds @type='burnished' to every <p>. In addition to the primary document output, both stylesheets also create a secondary <xsl:result-document> that is a simple XML structure that reports a count of the <p> elements.
Without <p:choose>, I can get all the parts working as expected, but when the XSLT step is within a choice, I can't get the secondary port. Here's the toy XProc document that I'm using:
<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc"
xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns:c="http://www.w3.org/ns/xproc-step" version="3.0">
<p:input port="source"/>
<p:output port="result" sequence="true"/>
<p:variable name="doctype" select="(//tei:div/@type)[1]"/>
<p:choose name="annotator">
<p:when test="$doctype='doc_a'">
<p:output port="result" primary="true"/>
<p:output port="secondary" primary="false" sequence="true"/>
<p:xslt>
<p:with-input port="stylesheet" href="process_a.xsl"/>
</p:xslt>
</p:when>
<p:otherwise>
<p:output port="result" primary="true"/>
<p:output port="secondary" primary="false" sequence="true"/>Mor
<p:xslt>
<p:with-input port="stylesheet" href="process_b.xsl"/>
</p:xslt>
</p:otherwise>
</p:choose>
<p:for-each message="processing for-each">
<p:with-input>
<p:pipe port="secondary" step="annotator"/>
</p:with-input>
<p:identity message="* * * storing data"></p:identity>
<p:store href="data_notes.xml" message="* * * * * store data notes"/>
</p:for-each>
<p:store>
<p:with-input>
<p:pipe port="result" step="annotator"/>
</p:with-input>
<p:with-option name="href" select="concat('output_', $doctype, '.xml')"/>
</p:store>
</p:declare-step>
Both Morgana and Calabash produce the primary output as expected, without error, and show the "processing for-each" message, but no other messages (with the asterisks) within the for-each. On the XSLT side if I put a message inside the <xsl:result-document> element, that also shows up. But I can't figure out how to actually get the secondary document itself when the XSLT steps are inside <p:choose>.
Is there a way to do this? I could always push the branching logic into XSLT if necessary, but it would seem to make more sense at the XProc level.
Advice welcome. Thanks!
Doug Knox
[1] https://lists.w3.org/Archives/Public/xproc-dev/2024Mar/thread.html#msg0
Received on Monday, 20 January 2025 08:13:25 UTC