QT4 CG Meeting 163 Minutes 2026-05-05

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

Table of Contents

Summary of new and continuing actions [0/8]

  • [ ] QT4CG-143-02: MK to try to recover the ability to extract formal equivalences into tests
  • [ ] QT4CG-160-02: NW to think about how to promote the dated drafts for broader community feedback.
  • [ ] QT4CG-165-01: NW to follow-up with the generator authors and schedule another discussion

Draft Minutes

1. Administrivia

1.1. Roll call [9/10]

  • [X] 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 12 May 2026.

Possible regrets from DB.

1.5. Review of open action items [6/8]

  • [ ] QT4CG-143-02: MK to try to recover the ability to extract formal equivalences into tests
  • [X] QT4CG-144-01: MK to consider if any now lost value comparisons should be added as examples.
    • Decided to make no further change. I reviewed the examples of fn:atomic-equal and fn:compare and decided they are adequate.
  • [X] QT4CG-156-01: MK: add reference to data model in F&O 9.2
    • Overtaken by events, already in F&O
  • [X] QT4CG-156-03: MK to revise PR #2516 in light of the comments.
    • Done in PR #2609
  • [X] QT4CG-158-01: MK to revisit the Conformance section to revise in light of #2556 error changes
    • I decided to make no change. I don't think we need a conformance feature for every aspect of processing that is implementation-defined.
  • [X] QT4CG-158-02: MK to add system-properties() keys for file and binary support
    • Done in PR #2603
  • [X] QT4CG-160-01: MK to fix the markup error in method/method call in #2578
    • Done in PR #2604
  • [ ] QT4CG-160-02: NW to think about how to promote the dated drafts for broader community feedback.

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 #2019: 1776: XSLT template rules for maps and array
  • PR #2071: 77c deep update
  • PR #2160: 2073 data model changes for JNodes and Sequences
  • PR #2247: 716 Deferred Evaluation in XPath - the f:generator record
  • PR #2350: 708 An alternative proposal for generators

ACTION QT4CG-165-01: NW to follow-up with the generator authors and schedule another discussion

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 #2608: 2312 Removal of Map/Array Filter (somewhat sigh)
  • PR #2607: 2314 fn:error: return type xs:error
  • PR #2604: Action QT4CG-160-01 Methods and Method Calls

MK reports that #2607 needs work. CG agrees to make a friendly change, still plan to merge at the end of the meeting.

Proposal: merge these PRs without discussion with that change.

Accepted

2. Technical agenda

2.1. PR #2614: 2613 make xsl:array-member create a JNode

See PR #2614

  • MK introduces the PR; perhaps there hasn’t been sufficient time for review.
  • MK: This is entirely XSLT.
    • … The motivation for this is that xsl:array-member has been through several iterations. The challenge is that we need a sequence that doesn’t get flattened.
    • … One solution was a zero-arity function item to represent that sequence.
    • … This PR changes that to return a JNode who’s value is the sequence.
    • … This allows you to combine the contents of an existing array with newly constructed array members.
  • NW: I think that’s a real improvement.
  • JWL: An xsl:array-member can only be under an xsl:array?
  • MK: No, you can put it in a called template or return it from a function.
  • JWL: But it always returns a JNode
  • MK: Yes
  • JWL: But xsl:map-entry returns a map.
  • MK: Yes; but I’m thinking of changing that.

Some discussion of the array concatentation example.

  • JWL: On that example, if we replaced the sequence with xsl:array-member/@select would we then get a nested array?
  • MK: I’d have to think hard about that.
  • JWL: I think we need an example of that.
  • JLO: What happens if there’s an arbitrary sequence, not a JNode?
  • MK: No, what xsl:array does if you supply things that aren’t JNodes it adds them as individual items.
  • WP: It might also be helpful in this context to show some more examples, with nested arrays for example.

Proposal: accept this PR?

Accepted.

2.2. PR #2611: 2598 New function fn:regex

See PR #2611

  • MK: This is a now presented as a free-standing PR, not bundled with anything else.

MK describes the semantics of the function and reviews the examples.

  • MK: The matches, replace, and other functions become methods on the regex record.
  • MK: I’ve added an _implementation field for implementation-defined extensions.
  • MK: There are questions of encapsulation here; if you take these methods out of the record, things may go badly wrong. So don’t.
  • JWL: In the example $regex ? replace(…) threw me a bit because we usually don’t have spaces.
  • MK: I’ve played with both coding styles, it’s not clear what the best answer is.
  • DB: Is the spec consistent about the spacing around that question mark, or whether it should be.
  • MK: The spacing doesn’t effect the behavior just the readability.
  • DB: But there’s no recommendation and the spec isn’t necessarily going to be consistent.
  • DB: What’s an anticipated use of the _implementation field?
  • MK: One way of implementing this would be for all the information about the compiled regex to go into the functions themselves. I felt that might lead replication. Another way of implementing it is to make this a special object internally that behaves like a map or record but has some hidden magic not exposed at all.
    • … This makes it a little more explicit that there’s magic; that there’s state.
    • … It might be as simple as a checksum so that the implementation can be sure it was one that it constructed.
  • DB: Is that a slippery slope? Do we care?
  • MK: Yes. We might learn from experience whether that’s useful or not.
  • CG: It was the _implementation option that I first looked at. I think we should drop it if we don’t have a serious use case for it. We don’t use this syntax anywhere else. To me, everything in this function looks like an implementation optimization, not something for the user to use.
  • MK: Well, obviously the alternative is caching; the problem is that it imposes a cost and you don’t know if that cost is going to deliver a benefit.
  • CG: It would be good to see some use cases. But my impressions are personal.
  • MK: One case is in XSLT pattern matching. You might want to use the same match conditions against very many nodes.
    • … You could say that there’s an obvious case for an optimizer to do the work there, but I don’t know…I like to give users the opportunity to be explict.
  • JLO: My points have been covered; I’d like to drop _implementation. I think if we do want something here, I’d like something more symbol-like.
    • … With respect to style, I’d put spaces around the ! never the ?.

Some further discussion of the readability of the example.

  • JK: Just a quick note that I’m greatful for the proposal. I represent a kind of use case in that one of my applications is a series of global changes to a large number of files and uses a lot of regular expressions. If you’re doing 200 regex replacements against every text node in a large collection of documents, you want it to be faster.
  • MK: The current Saxon implementation pre-compiles regular expressions if they’re compile time constants. There are cases where it’s computed at runtime and still used repeatedly.
  • JWL: The use of tokenize there is confusing.
  • WP: I can see places where it would be very nice to have this. My question isn’t about the style, but how is ! different from ? in that location. I think there might be more clarification needed there.

MK agrees to take this feedback and make another pass.

  • CG: We have functions like transform that have a cache option; maybe that could be a useful approach here?
  • WP: In general, I need an education in caching.

2.3. PR #2610: 2584 Absolute path expressions starting at map or array

See PR #2610

MK introduces the topic. It was CG’s issue, but it’s MK’s PR.

  • MK: I’ve rewritten the grammar to allow a leading slash to start at a JNode.
    • … The amount of change isn’t all that great.
  • MK: There’s a new section about what a path beginning / means.
    • / by itself is /.
    • … It spells out the other possibilities for every item.
    • … The case where we wrap a map or array in a jtree is the one that concerned me. It’s basically a no-op, but it’s allowed for generality.
  • MK: There’s a new section about what a path beginning // means.
    • … It’s much the same
  • JWL: If you’ve got a map inside a map and you then go down, do a select, get to the inner map, what does / mean then?
  • MK: The complex cases are where you do a downward selection then have a predicate that uses /.

MK illustrates a complex case: $map//name[//city=’London’]

  • MK: You’ve got to think quite hard about whether or not //city causes an upward naviagation and if it does, where it goes.
    • … In this case JNodes are selected, so it’s actually going to go up to the $map which is the root of the tree.
    • … But there are other cases I worry about where the root in the predicate might be different.

MK proposes $map//name => jvalue(.)[//city='London']

  • MK: That’s different.

Some discussion of how you’d assign variables, make them JNodes, etc. Lots of possibilities.

  • JWL: It depends on whether or not you did type coercion in a variable.
  • CG: Thank you for the PR. One reason for creating the issue was that many people tend to write a and /a and they use them in the same way when the start at the root. It can be hard to explain the differences to users. If you make it easy for the everyday user, that will be an advantage.
  • MK: One of my concerns is that static analysis is difficult when we don’t know if we’re dealing with XNodes or JNodes. But that’s an implementation problem.

Proposal: accept this PR.

Accepted.

2.4. PR #2609: QT4CG-156-03 Revise text on JNode identity

See PR #2609

MK proposes to skip this until next week.

2.5. PR #2606: 2605 copy, move: define behavior when target is inside source dir

See PR #2606

CG introduces the topic.

  • CG: This is a special case for file:copy and file:move. You can specify a source and target, when the target is located inside the source, that can lead to cyclic behavior.
    • … I decide to make this an error.

Proposal: accept this PR.

Accepted.

2.6. PR #2603: 2602 EXPath file and binary modules as optional features

See PR #2603

MK proposes to skip this until next week; it’s being revised to improve clarity.

2.7. PR #2601: 2568 Error code changes for dateTime functions

See PR #2601

MK reviews the PR.

  • JWL: The error code for the timezone one has a formatting problem. (-PT14H gets split between “-” and “P”)
  • JK: I would prefer to see something similer to 001 for values outside an expected range. The complaint was that FORG001 already covers a lot of problems. But as MK said, that’s about casting and the data type, not with whether it’s in an expected value.
  • MK: I think it was done this way because when you do casting we do allow the value 24. But on this function we don’t.
  • JLO: I like JK’s idea of having more general error codes here.
  • MK: Let’s get rid of FODT006 and use FORG001 there as well.

2.8. PR #2595: DM edits on XML Schema data types

See PR #2595

  • JK: This is really editorial; or it’s intended to be.
    • … It’s motivated by checking on the data types. I was curious to know if regexes could be a data type.
    • … There was text in Predefined Types that was largely repeated from Types adopted from XML Schema.
    • … I’ve moved them and put them closer together.
  • JK: I also took the opportunity to present items that hadn’t got formal definitions: in particular, xs:numeric
  • JK: And I added a lot of cross references.

Proposal: accept this PR.

Accepted.

3. Any other business

None heard.