<!--- This environment context section helps us quickly review your PR. 
      Please take a minute to fill-out this information. -->
## Environment

**Liquibase Version**: 4.4.0

**Liquibase Integration & Version**: Maven

**Liquibase Extension(s) & Version**: None

**Database Vendor & Version**: All

**Operating System Type & Version**: Any


## Description

I am using XML changelog with <includeAll> for which path is mandatory in a zip file

```
<includeAll path="" relativeToChangelogFile="true" filter="my.XMLFilter"/>
```

I want to include all files in the directory of the changelog.
1. `<includeAll path="">` => Not working, is resolved to root of the zip archive
2. `<includeAll path=".">` => Not working, path is not normalized and ZipFileSystem does not resolve `myfolder/./` as `myfolder/`

## Steps To Reproduce

PR with unit Test to come...

## Actual Behavior
First case run into stack overflow
Second case does not find any file


## Expected/Desired Behavior
Expected behavior is to have the same behavior as regular file system


## Additional Context
Resolution can be to modify liquibase.resource.FileSystemResourceAccessor lines 237 - 239:

From 
```
                    if (path != null) {
                        basePath = basePath.resolve(path);
                    }
```
To
```
                    if (StringUtil.isNotEmpty(path)) {
                        basePath = basePath.resolve(path).normalize();
                    }
```





}
    public void validate(Database database, String... contexts) throws LiquibaseException {
        this.validate(database, new Contexts(contexts), new LabelExpression());
    }
    public void validate(Database database, Contexts contexts, LabelExpression labelExpression)
            throws LiquibaseException {
        database.setObjectQuotingStrategy(objectQuotingStrategy);
        ChangeLogIterator logIterator = new ChangeLogIterator(
                this,
                new DbmsChangeSetFilter(database),
                new ContextChangeSetFilter(contexts),
                new LabelChangeSetFilter(labelExpression)
        );
        ValidatingVisitor validatingVisitor = new ValidatingVisitor(database.getRanChangeSetList());
        validatingVisitor.validate(database, this);
        logIterator.run(validatingVisitor, new RuntimeEnvironment(database, contexts, labelExpression));
        for (String message : validatingVisitor.getWarnings().getMessages()) {
            Scope.getCurrentScope().getLog(getClass()).warning(message);
        }
        if (!validatingVisitor.validationPassed()) {
            throw new ValidationFailedException(validatingVisitor);
        }
    }
    public ChangeSet getChangeSet(RanChangeSet ranChangeSet) {
        final ChangeSet changeSet = getChangeSet(ranChangeSet.getChangeLog(), ranChangeSet.getAuthor(), ranChangeSet.getId());
        if (changeSet != null) {
            changeSet.setStoredFilePath(ranChangeSet.getStoredChangeLog());
        }
        return changeSet;
    }