- From: Heidi Vanparys <hevan@kds.dk>
- Date: Mon, 24 Feb 2025 15:55:24 +0000
- To: "xproc-dev@w3.org" <xproc-dev@w3.org>
Hi I have a question regarding p:directory-list and what the function base-uri is supposed to return when iterating over the output. https://spec.xproc.org/lastcall-2024-08/head/file/#c.directory-list states that: "Each of the elements c:file, c:directory, and c:other has a name attribute, whose value is a relative IRI reference, giving the (local) file or directory name. Each of these element also contains the corresponding resource’s URI in an xml:base attribute, which may be a relative URI for any but the top-level c:directory element. In the case of c:directory, it must end in a trailing slash. This way, users will always be able to compute the absolute URI for any of these elements by applying fn:base-uri() to it." I have the following pipeline (a minimal example for this question), that tries to compute the absolute URIs of the resources represented by c:directory and c:file elements by using the base-uri() function. I also included the result of base-uri(/), as https://spec.xproc.org/lastcall-2024-08/head/file/#c.directory-list also states that: "The result document produced for the specified directory path has a c:directory document element whose base URI, attached as an xml:base attribute, is the absolute directory path (expressed as a URI that ends in a slash) and whose name attribute (without a trailing slash) is the last segment of the directory path. The same base URI is attached as the resulting document’s base-uri property and, accordingly, as its document node’s base URI." <?xml version="1.0" encoding="UTF-8"?> <p:declare-step xmlns:c="http://www.w3.org/ns/xproc-step" xmlns:err="http://www.w3.org/ns/xproc-error" xmlns:p="http://www.w3.org/ns/xproc" name="urify" version="3.0"> <p:option name="input-directory" /> <p:variable name="input-directory-urified" select="p:urify($input-directory)" /> <p:directory-list name="create-directory-list" message="Produce list of contents of {$input-directory} (urified: {$input-directory-urified})"> <p:with-option name="path" select="$input-directory-urified" /> <p:with-option name="max-depth" select="'unbounded'" /> </p:directory-list> <p:identity message="DIRECTORIES" /> <p:for-each name="base-uris-directories"> <p:with-input select="//c:directory" /> <p:identity message="{p:iteration-position()}: base-uri(/) = {base-uri(/)}" /> <p:identity message="{p:iteration-position()}: base-uri(/c:directory) = {base-uri(/c:directory)}" /> <p:identity message="{p:iteration-position()}: base-uri(/) eq base-uri(/c:directory) = {base-uri(/) eq base-uri(/c:directory)}" /> </p:for-each> <!-- Control order with depends --> <p:identity message="FILES" depends="base-uris-directories"> <p:with-input> <p:pipe step="create-directory-list" port="result" /> </p:with-input> </p:identity> <p:for-each name="base-uris-files"> <p:with-input select="//c:file" /> <p:identity message="{p:iteration-position()}: base-uri(/) = {base-uri(/)}" /> <p:identity message="{p:iteration-position()}: base-uri(/c:file) = {base-uri(/c:file)}" /> <p:identity message="{p:iteration-position()}: base-uri(/) eq base-uri(/c:file)? = {base-uri(/) eq base-uri(/c:file)}" /> </p:for-each> </p:declare-step> I'm running this pipeline with the following directory structure: H:\test +---sub1 | a.txt | b.txt | \---sub2 c.txt d.txt Output with Calabash alpha21: Produce list of contents of H:\test (urified: file:///H:/test) DIRECTORIES 1: base-uri(/) = file:/H:/test/ 1: base-uri(/c:directory) = file:/H:/test/ 1: base-uri(/) eq base-uri(/c:directory) = true 2: base-uri(/) = file:/H:/test/sub1/ 2: base-uri(/c:directory) = file:/H:/test/sub1/sub1/ 2: base-uri(/) eq base-uri(/c:directory) = false 3: base-uri(/) = file:/H:/test/sub2/ 3: base-uri(/c:directory) = file:/H:/test/sub2/sub2/ 3: base-uri(/) eq base-uri(/c:directory) = false FILES 1: base-uri(/) = file:/H:/test/sub1/a.txt 1: base-uri(/c:file) = file:/H:/test/sub1/a.txt 1: base-uri(/) eq base-uri(/c:file)? = true 2: base-uri(/) = file:/H:/test/sub1/b.txt 2: base-uri(/c:file) = file:/H:/test/sub1/b.txt 2: base-uri(/) eq base-uri(/c:file)? = true 3: base-uri(/) = file:/H:/test/sub2/c.txt 3: base-uri(/c:file) = file:/H:/test/sub2/c.txt 3: base-uri(/) eq base-uri(/c:file)? = true 4: base-uri(/) = file:/H:/test/sub2/d.txt 4: base-uri(/c:file) = file:/H:/test/sub2/d.txt 4: base-uri(/) eq base-uri(/c:file)? = true Output (minus the timestamps) with Morgana 1.5: Produce list of contents of H:\test (urified: file:///H:/test) DIRECTORIES 1: base-uri(/) = file:/H:/test/ 1: base-uri(/c:directory) = file:/H:/test/ 1: base-uri(/) eq base-uri(/c:directory) = true 2: base-uri(/) = file:/H:/test/sub1/ 2: base-uri(/c:directory) = file:/H:/test/sub1/sub1/ 2: base-uri(/) eq base-uri(/c:directory) = false 3: base-uri(/) = file:/H:/test/sub2/ 3: base-uri(/c:directory) = file:/H:/test/sub2/sub2/ 3: base-uri(/) eq base-uri(/c:directory) = false FILES 1: base-uri(/) = file:/H:/test/sub1/a.txt 1: base-uri(/c:file) = file:/H:/test/sub1/a.txt 1: base-uri(/) eq base-uri(/c:file)? = true 2: base-uri(/) = file:/H:/test/sub1/b.txt 2: base-uri(/c:file) = file:/H:/test/sub1/b.txt 2: base-uri(/) eq base-uri(/c:file)? = true 3: base-uri(/) = file:/H:/test/sub2/c.txt 3: base-uri(/c:file) = file:/H:/test/sub2/c.txt 3: base-uri(/) eq base-uri(/c:file)? = true 4: base-uri(/) = file:/H:/test/sub2/d.txt 4: base-uri(/c:file) = file:/H:/test/sub2/d.txt 4: base-uri(/) eq base-uri(/c:file)? = true Output (minus the timestamps) with Morgana 1.4.10: Produce list of contents of H:\test (urified: file:///H:/test) DIRECTORIES 1: base-uri(/) = file:/H:/test/ 1: base-uri(/c:directory) = file:/H:/test/ 1: base-uri(/) eq base-uri(/c:directory) = true 2: base-uri(/) = file:/H:/test/ 2: base-uri(/c:directory) = file:/H:/test/sub1/ 2: base-uri(/) eq base-uri(/c:directory) = false 3: base-uri(/) = file:/H:/test/ 3: base-uri(/c:directory) = file:/H:/test/sub2/ 3: base-uri(/) eq base-uri(/c:directory) = false FILES 1: base-uri(/) = file:/H:/test/ 1: base-uri(/c:file) = file:/H:/test/sub1/a.txt 1: base-uri(/) eq base-uri(/c:file)? = false 2: base-uri(/) = file:/H:/test/ 2: base-uri(/c:file) = file:/H:/test/sub1/b.txt 2: base-uri(/) eq base-uri(/c:file)? = false 3: base-uri(/) = file:/H:/test/ 3: base-uri(/c:file) = file:/H:/test/sub2/c.txt 3: base-uri(/) eq base-uri(/c:file)? = false 4: base-uri(/) = file:/H:/test/ 4: base-uri(/c:file) = file:/H:/test/sub2/d.txt 4: base-uri(/) eq base-uri(/c:file)? = false The output of base-uri(/c:file) is as I expected it to be for all three invocations (my expectation being based on what the specification says, or at least how I understand it). However, the output of base-uri(/c:directory) is not as I expected it to be for Morgana 1.5 and Calabash alpha21: - for directory H:\test\sub1 , base-uri(/c:directory) returns file:/H:/test/sub1/sub1/ , not file:/H:/test/sub1/ - for directory H:\test\sub2 , base-uri(/c:directory) returns file:/H:/test/sub2/sub2/ , not file:/H:/test/sub2/ Do I misunderstand the specification? If yes, how do I have to understand it? Or are the implementations wrong? Best regards Heidi Vanparys
Received on Tuesday, 25 February 2025 09:54:28 UTC