question on p:directory-list and base-uri()

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