QT4 CG Meeting 155 Minutes 2026-03-10

Meeting index / QT4CG.org / Dashboard / GH Issues / GH Pull Requests

Table of Contents

Summary of new and continuing actions [0/13]

  • [ ] QT4CG-143-02: MK to try to recover the ability to extract formal equivalences into tests
  • [ ] QT4CG-143-03: JK to look for C14N test suites.
  • [ ] QT4CG-144-01: MK to consider if any now lost value comparisons should be added as examples.
  • [ ] QT4CG-150-01: NW to ask Jirka for a room at XML Prague for Tuesday/Wednesday
  • [ ] QT4CG-150-04: NW to see about a status update on PR #2345; possibly schedule discussion
  • [ ] QT4CG-151-01: MK to fix the typo in the build-dateTime function.
  • [ ] QT4CG-152-01: MK to add a note about the new and old syntax for names in PR #2446
  • [ ] QT4CG-153-01: MK to investigate the indentation problem.
  • [ ] QT4CG-153-02: MK to turn my suggestions on #1949 into a PR.
  • [ ] QT4CG-154-01: MK to review why anyAtomicType didn’t, in fact, become a square box!
  • [ ] QT4CG-154-02: MK to add a note about “tunneling” package parameters.
  • [ ] QT4CG-155-01: MK to add an example of function coercion that uses ?.
  • [ ] QT4CG-155-02: MK to clarify that the seconds value can be 59.9, etc. (exlusive vs. inclusive)

Draft Minutes

1. Administrivia

1.1. Roll call [8/10]

Regrets: DB

  • [ ] David J Birnbaum (DB)
  • [ ] Reece Dunn (RD)
  • [X] Christian Grün (CG)
  • [X] Joel Kalvesmaki (JK)
  • [X] Michael Kay (MK)
  • [X] Juri Leino (JLO)
  • [X] John Lumley (JWL)
  • [X] Alan Painter (AP
  • [X] Wendell Piez (WP)
  • [X] Norm Tovey-Walsh (NW) Scribe. Chair.

1.2. Accept the agenda

Proposal: Accept the agenda.

Accepted.

1.3. Approve minutes of the previous meeting

Proposal: Accept the minutes of the previous meeting.

Accepted.

1.4. Next meeting

The next meeting is planned for 17 March 2026.

Note: Daylight Saving Time begins in North America on Sunday, 8 March. It does not begin in the UK and Europe until Sunday, 29 March. The QT4CG meets on UK and European civil time. The meetings of 17 and 24 March will be one hour later in North America.

NW gives regrets for 17, 24, and 31 March. He’ll try to publish agendas per usual and if the appointed scribe sends notes, he’ll integrate them into the archive as usual.

JK to chair. JWL volunteers to scribe at least some of them.

1.5. Review of open action items [3/14]

  • [ ] QT4CG-143-02: MK to try to recover the ability to extract formal equivalences into tests
  • [ ] QT4CG-143-03: JK to look for C14N test suites.
  • [ ] QT4CG-144-01: MK to consider if any now lost value comparisons should be added as examples.
  • [X] QT4CG-149-01: CG to draft a new PR with the common rule note.
  • [ ] QT4CG-150-01: NW to ask Jirka for a room at XML Prague for Tuesday/Wednesday
  • [ ] QT4CG-150-04: NW to see about a status update on PR #2345; possibly schedule discussion
  • [ ] QT4CG-151-01: MK to fix the typo in the build-dateTime function.
  • [X] QT4CG-151-03: NW to investigate why records are formatted incorrectly in XSLT
  • [ ] QT4CG-152-01: MK to add a note about the new and old syntax for names in PR #2446
  • [ ] QT4CG-153-01: MK to investigate the indentation problem.
  • [ ] QT4CG-153-02: MK to turn my suggestions on #1949 into a PR.
  • [ ] QT4CG-154-01: MK to review why anyAtomicType didn’t, in fact, become a square box!
  • [ ] QT4CG-154-02: MK to add a note about “tunneling” package parameters.
  • [X] QT4CG-154-03: NW to make sure that the streaming spec goes in the diff list

1.6. Review of open pull requests and issues

This section summarizes all of the issues and pull requests that need to be resolved before we can finish. See Technical Agenda below for the focus of this meeting.

1.6.1. Blocked

The following PRs are open but have merge conflicts or comments which suggest they aren’t ready for action.

  • PR #2266: 540 system-property equivalent for XQuery
  • PR #2160: 2073 data model changes for JNodes and Sequences
  • PR #2071: 77c deep update
  • PR #2019: 1776: XSLT template rules for maps and array

1.6.2. Merge without discussion

The following PRs are editorial, small, or otherwise appeared to be uncontroversial when the agenda was prepared. The chairs propose that these can be merged without discussion. If you think discussion is necessary, please say so.

  • PR #2509: 2477 Get current date in streaming spec
  • PR #2507: 2498 Change output of type-of() when applied to a JNode

Proposal: merge without discussion.

Accepted.

1.6.3. Substantive PRs

The following substantive PRs were open when this agenda was prepared.

  • PR #2510: Alternate proposal for #2460
  • PR #2509: 2477 Get current date in streaming spec
  • PR #2508: 2353 (stylesheet change)
  • PR #2506: 2500 Coerce the target of a dynamic function call
  • PR #2505: 2503 Clarify validity of dateTime-record
  • PR #2504: Propose a minimalist alternative for generators in order to stimulate some discussion.
  • PR #2501: 2499 default priority of predicate patterns
  • PR #2478: 2476 guaranteed streamability
  • PR #2470: 1310 Functions fn:regex and ?matching-substrings
  • PR #2467: Harmonize the fn: and file: functions that read text
  • PR #2350: 708 An alternative proposal for generators
  • PR #2345: 2299 Expand pipeline to allow arrow expression in path expression
  • PR #2313: 2298 XQFO rules: definition of default values
  • PR #2247: 716 Deferred Evaluation in XPath - the f:generator record
  • PR #2019: 1776: XSLT template rules for maps and array

1.6.4. Issues to be discussed

  • Issue #2462: Revert dynamic function calls on sequences

2. Technical agenda

2.1. Issue #2462: Revert dynamic function calls on sequences

See issue #2462.

  • CG: This issue has a long history. I think I first proposed the change and so did MK. We generalized dynamic function calls to sequences. The challenge is that we got feedback from users who found this confusing. Especially from folks who don’t use functions. Now you can do things like ()() and $add(1,2) returns () if $add turns out to be empty. These things can be quite confusing.
    • … We should favor type safety and readability over convenience. If a short syntax is needed, we can do better.
  • MK: I think there are two changes one could make independently: require a cardinality of zero or one (or maybe just one).
    • … In each case a dynamic function is a postfix operation and in other cases we allow arbitrary sequence son the left.
    • … On the left of open paren, you can have a path expression that can return an arbitrary sequence of things (like maps). You can treat those as functions and there’s an argument for making the function call syntax symmetric. Otherwise, the rhythm of the post fix expression gets broken.
  • JLO: I’m with MK, not being able to filter an empty sequence is also confusing.
    • … It makes sense: sometimes you have a function and sometimes you don’t.
    • … I’m in favor of keeping it.
  • WP: In XSLT, we bind a variable to a function we can call it. Is this just an extension into XPath?
    • … This enables us to do multiple calls on a sequence. I think we could explain it.
  • NW: MK can you expand on cardinality?
  • MK: At the moment, the required time on the left is function*, we could change it to be function?.
    • … But the arguments here are for not allowing empty; and I think the argument for keeping empty is stronger.
  • NW: I accept the orthogonality; I’m not looking forward to the first time I trip over $add(1,2) silently returning empty sequence.
  • JWL: Given that $add(1,2) example; $add could be any sequence of functions, so you’d get a sequence of results. Is (1,2) a single argument or a set of arguments?
  • MK: You’re invoking each of the functions with the argument list (1,2).
  • NW: I think there’s a plurality of support for keeping the status quo.
  • CG: I can live with that.

Some discussion of methods. That’s a separate issue.

Proposal: we’ll close

2.2. PR #2510: Alternate proposal for #2460

See PR #2510.

Norm to amend the text to make a point out that decoding is also involved.

Norm to fix the char() reference

Proposal: Norm does the editorial things and merges it.

Accepted.

2.3. PR #2506: 2500 Coerce the target of a dynamic function call

See PR #2506.

  • MK: This was the observation that we have tests that assume coercion happens here and the spec doesn’t say so. So we need to fix one or the other.
  • MK: This PR applies coercion to the target of a dynamic function call.
    • … There’s a new example that illustrates that.
  • JWL: Can that be rewritten as Beatles/*??
  • MK: Yes.
  • JWL: And it’s the same?
  • MK: Yes.
  • JWL: Would you have to use JValue?
  • MK: No, because you wouldn’t get JNodes.

ACTION: MK to add an example of function coercion that uses ?.

Proposal: Accept this PR.

Accepted.

2.4. PR #2505: 2503 Clarify validity of dateTime-record

See PR #2505.

  • MK: The observation was that we’ve given constraints on the ranges of these values in the record.
    • … But we have no way of constraining the range. I’ve rephrased things and clarified it with a note.
    • … But note that it will be rejected by fn:build-dateTime.
  • JWL: When reading this, I was puzzled by the difference between inclusive and exclusive.
    • … But in the case of seconds, you can go up to anything less than 60!

ACTION: MK to clarify that the seconds value can be 59.9, etc. (exlusive vs. inclusive)

  • JLO: Is dateTime-record something we could use for other calendars?
  • MK: No, it’s intended to correspond to the Gregorian calendar.

(JK observes: https://www.wwp.neu.edu/research/publications/documentation/other/dates_and_times_in_DH.xhtml )

Proposal: Accept this PR.

Accepted.

2.5. PR #2504: Propose a minimalist alternative for generators in order to stimulate some discussion.

See PR #2504.

  • AP: I was trying to take a different approach than DN. But I stole a lot of things from him.
    • … I added another section about data formats.
    • … I called it a generate-record because I think it’s more precise.
    • … I remove a couple of fields.
    • … I’m suggesting rather than having a field end-reached, we compare the generator with an empty generator.
    • … The empty generator is returned by fn:empty-generator.
    • gn:empty then returns true if the generator is empty.
    • … I was hoping for reference equality; but that’s not going to work.
    • … But we should be able to count on fn:deep-equals.
  • AP: And there are a couple of examples. An unbounded one and a couple of examples of bounded ones.
  • JWL: There’s a typo on the signature for empty; it shouldn’t be empty-generator in 17.7.3.2.
    • … This looks like a nice minimalist approach. But don’t you have to make repeated calls to the comparison function. I’m not absolutely sure that’s the neatest way to do it.
  • NW: If you return empty generator after you’ve finished, how do you get the final accumulated results?
  • AP: I think you’re misunderstanding.
  • NW: Perhaps. I’ll investigate.
  • MK: I greatly appreciate the fact that this is much more minimilist.
    • … I don’t think I’ve understood the detail well enough to understand the usibility.
    • … It would be nice to see a more realistic use case that illustrates that.
    • … And it would be nice to have an example that you can’t do some other way: what does this enable? It needs a better “sell”.
  • AP: I have another one I’m working on that’s the equivalent of slice; that’s currently an iteration over all the items in a sequence; the generator wouldn’t have to work that way.
  • MK: I do think it would be better in its own section, not in data formats.
  • AP: Okay.
  • MK: An example that uses the functions in the file module might help to motivate it.
  • CG: Thank you. I like the minimilist approach. It’s much easier to digest. Many of the examples we saw for generators can be realized with recursive functions, with while loops, with fold-left; it might be nice to show comparisons to those features. Some use cases are easier to express without generators, but some are really suited to them. It would be nice to see the really suitable example.
  • AP: Okay.
  • JLO: I also think this is easier to take in. But I fear, looking at the fib0 example, you don’t want to do that, do you?
    • … It looks like it could be a while loop!
  • AP: My experience doing this for the JSONPath example was that this was the only way to calculate them incrementally.
    • … This is a lot of code; I’ll try to make it shorter.

Some discussion of how this might be a fold.

2.6. PR #2501: 2499 default priority of predicate patterns

See PR #2501.

  • MK: This is a bug fix to change it from 0.5 to 1. That’s for compatibility with XSLT 3.0.
    • … 0.5 would be more logical, but it’s not worth it.

Proposal: Accept this PR.

Accepted.

2.7. PR #2478: 2476 guaranteed streamability

See PR #2478.

  • MK: This is part of the exercise to update streaming to 4.0.
  • MK: The spec has rules for construct that are supposed to be guaranteed streamable.
    • … I wanted to make that a minimal constraint; the current spec has to check for things that you might optimize away.
    • … It’s very hard to implement. The only benefit is that if it’s streamable on one processor, it’ll be streamable on all of them.

Proposal: Accept this PR.

Accepted.

3. Any other business

None heard.