Re: [xsl] How do you avoid relearning the same coding technique over and over?

Subject: Re: [xsl] How do you avoid relearning the same coding technique over and over?
From: "Dimitre Novatchev dnovatchev@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 6 Feb 2025 16:11:48 -0000
Show example code of an XSLT transformation that uses the EXpath file
module to iterate over a set of folders and then for each folder iterate
over its files.
ChatGPT said:

Sure! Below is an example of an XSLT transformation that utilizes the *EXPath
File Module* to iterate over a set of folders and then, for each folder,
iterate over its files. This assumes that you are using an XSLT 2.0 or 3.0
processor that supports EXPath extensions, such as *Saxon with EXPath
extensions*.
Example XSLT Code:

xml
CopyEdit
<xsl:stylesheet version="3.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
    xmlns:file="http://expath.org/ns/file";
    exclude-result-prefixes="file">

    <!-- Define the base directory -->
    <xsl:param name="base-dir" select="'/path/to/base/directory'"
as="xs:string"/>

    <xsl:template match="/">
        <folders>
            <!-- Iterate over the directories inside the base directory -->
            <xsl:for-each select="file:list($base-dir)">
                <xsl:variable name="folder-path"
select="file:resolve-path(concat($base-dir, '/', .))"/>

                <!-- Check if it's a directory -->
                <xsl:if test="file:is-dir($folder-path)">
                    <folder name="{.}">
                        <!-- Iterate over the files in this folder -->
                        <xsl:for-each select="file:list($folder-path)">
                            <xsl:variable name="file-path"
select="file:resolve-path(concat($folder-path, '/', .))"/>

                            <!-- Check if it's a file -->
                            <xsl:if test="file:is-file($file-path)">
                                <file name="{.}"/>
                            </xsl:if>
                        </xsl:for-each>
                    </folder>
                </xsl:if>
            </xsl:for-each>
        </folders>
    </xsl:template>
</xsl:stylesheet>

Explanation:

   1. *file:list($base-dir)* b Retrieves the list of items in the base
   directory.
   2. *file:is-dir($folder-path)* b Checks if the current item is a
   directory.
   3. *file:list($folder-path)* b Lists the contents of each directory.
   4. *file:is-file($file-path)* b Checks if the current item is a file.
   5. The output XML structure includes <folders>, with each <folder>
   containing its <file> elements.

Sample Output:

xml
CopyEdit
<folders>
    <folder name="Documents">
        <file name="report.pdf"/>
        <file name="notes.txt"/>
    </folder>
    <folder name="Images">
        <file name="photo.jpg"/>
        <file name="logo.png"/>
    </folder></folders>

This approach efficiently traverses directories and files using *EXPath
File Module* functions. Let me know if you need any modifications! p
4o

On Thu, Feb 6, 2025 at 4:19b/AM Roger L Costello costello@xxxxxxxxx <
xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:

> Hi Folks,
>
> A few days ago, I needed some code to iterate over a set of folders and
> then for each folder iterate over its files.
>
> Over the years I have solved that problem--use the expath file
> module--many times. In my most recent need, I spent a few minutes searching
> my file system to find an XSLT program that uses the expath module, but I
> didn't find anything, so I spent time relearning how to use the expath file
> module. What a waste of time.
>
> In the ideal world, when I develop some code--such as code to iterate over
> folders and subfolders--I would pause what I'm doing, create example code
> showing how to solve the task, and store that example code in some location
> on my file system that I'll remember 6 months, 6 years later. Alas, I'm in
> a hurry. I don't do that.
>
> What's the solution? Discipline? No matter how much I'm in a hurry, stop
> and create an example. Is that the solution?
>
> How do you avoid relearning the same coding technique over and over?
>
> /Roger
>
>
>

--
Cheers,
Dimitre Novatchev
---------------------------------------
Truly great madness cannot be achieved without significant intelligence.
---------------------------------------
To invent, you need a good imagination and a pile of junk
-------------------------------------
Never fight an inanimate object
-------------------------------------
To avoid situations in which you might make mistakes may be the
biggest mistake of all
------------------------------------
Quality means doing it right when no one is looking.
-------------------------------------
You've achieved success in your field when you don't know whether what
you're doing is work or play
-------------------------------------
To achieve the impossible dream, try going to sleep.
-------------------------------------
Facts do not cease to exist because they are ignored.
-------------------------------------
Typing monkeys will write all Shakespeare's works in 200yrs.Will they write
all patents, too? :)
-------------------------------------
Sanity is madness put to good use.
-------------------------------------
I finally figured out the only reason to be alive is to enjoy it.

Current Thread