<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" xmlns:px="http://www.daisy.org/ns/pipeline/xproc" xmlns:pf="http://www.daisy.org/ns/pipeline/functions" xmlns:cx="http://xmlcalabash.com/ns/extensions" xmlns:d="http://www.daisy.org/ns/pipeline/data" version="1.0" type="px:fileset-filter-in-memory" name="main"> <p:documentation xmlns="http://www.w3.org/1999/xhtml"> <p>Remove the entries from a fileset that are not loaded into memory.</p> </p:documentation> <p:input port="source.fileset" primary="true"/> <p:input port="source.in-memory" sequence="true"/> <p:output port="result" primary="true"> <p:pipe step="result" port="result"/> </p:output> <p:output port="result.in-memory" sequence="true"> <p:documentation xmlns="http://www.w3.org/1999/xhtml"> <p>The pruned fileset</p> <p>The manifest contains only the files from "source.fileset" for which a document exists on the "source.in-memory port", and the "result.in-memory" port contains only documents that are present in the manifest. No documents are loaded from disk.</p> </p:documentation> <p:pipe step="result.in-memory" port="result"/> </p:output> <p:output port="not-in-memory"> <p:documentation xmlns="http://www.w3.org/1999/xhtml"> <p>Files from "source" that are not included in "result", i.e. the files that were filtered out.</p> </p:documentation> <p:pipe step="not-in-memory" port="result"/> </p:output> <p:output port="not-in-manifest"> <p:documentation xmlns="http://www.w3.org/1999/xhtml"> <p>Fileset of in-memory documents that are not contained in the input fileset.</p> </p:documentation> <p:pipe step="not-in-manifest" port="result"/> </p:output> <p:import href="fileset-create.xpl"/> <p:import href="fileset-add-entries.xpl"/> <p:import href="fileset-intersect.xpl"/> <p:import href="fileset-diff.xpl"/> <p:import href="http://www.daisy.org/pipeline/modules/file-utils/library.xpl"> <p:documentation> px:set-base-uri </p:documentation> </p:import> <cx:import href="http://www.daisy.org/pipeline/modules/file-utils/uri-functions.xsl" type="application/xslt+xml"> <p:documentation> pf:normalize-uri </p:documentation> </cx:import> <p:sink/> <px:fileset-create/> <px:fileset-add-entries name="fileset-from-in-memory"> <p:input port="entries"> <p:pipe step="main" port="source.in-memory"/> </p:input> </px:fileset-add-entries> <p:sink/> <px:fileset-intersect name="result" cx:pure="true"> <p:input port="source"> <p:pipe step="main" port="source.fileset"/> <p:pipe step="fileset-from-in-memory" port="result.fileset"/> </p:input> </px:fileset-intersect> <p:sink/> <p:group name="result.in-memory" cx:pure="true"> <p:output port="result" sequence="true"/> <p:for-each name="source.in-memory.normalized"> <p:iteration-source> <p:pipe step="main" port="source.in-memory"/> </p:iteration-source> <p:output port="result"/> <p:variable name="old-base" select="base-uri(/)"/> <p:variable name="old-root-base" select="base-uri(/*)"/> <p:variable name="new-base" select="pf:normalize-uri($old-root-base)"/> <p:choose> <p:when test="$new-base=$old-base"> <p:identity/> </p:when> <p:when test="$old-root-base=''"> <px:set-base-uri> <p:with-option name="base-uri" select="pf:normalize-uri($old-base)"/> </px:set-base-uri> </p:when> <p:otherwise> <px:set-base-uri> <p:with-option name="base-uri" select="$new-base"/> </px:set-base-uri> </p:otherwise> </p:choose> </p:for-each> <p:sink/> <p:for-each> <p:iteration-source select="//d:file"> <p:pipe step="result" port="result"/> </p:iteration-source> <p:output port="result" sequence="true"/> <p:split-sequence> <p:input port="source"> <p:pipe step="source.in-memory.normalized" port="result"/> </p:input> <p:with-option name="test" select="concat('base-uri(/*)="',/*/resolve-uri(@href,base-uri(.)),'"')"/> </p:split-sequence> <p:split-sequence test="position()=1"/> </p:for-each> </p:group> <p:sink/> <px:fileset-diff name="not-in-manifest" cx:pure="true"> <p:input port="source"> <p:pipe step="fileset-from-in-memory" port="result.fileset"/> </p:input> <p:input port="secondary"> <p:pipe step="main" port="source.fileset"/> </p:input> </px:fileset-diff> <p:sink/> <px:fileset-diff name="not-in-memory" cx:pure="true"> <p:input port="source"> <p:pipe step="main" port="source.fileset"/> </p:input> <p:input port="secondary"> <p:pipe step="fileset-from-in-memory" port="result.fileset"/> </p:input> </px:fileset-diff> <p:sink/> </p:declare-step>