QT4 CG Meeting 176 Minutes 2026-08-18
Meeting index / QT4CG.org / Dashboard / GH Issues / GH Pull Requests
Table of Contents
- Summary of new and continuing actions
[0/7] - Draft Minutes
- 1. Administrivia
- 2. Technical agenda
- 2.1. PR #2831: 2809 fn:deep-equal, debug option: nondeterminism
- 2.2. PR #2841: 2838 rename decode-from-uri as decode-uri
- 2.3. PR #2842: 2801 Align the output of matching-segments() and regex-groups()
- 2.4. PR #2840: 2825 Generalize fn:jtree to accept any value as input
- 2.5. PR #2839: 2836 Add fn:location function
- 2.6. PR #2834: 2830 Clarify the effect of the line-ending serialization parameter
- 2.7. PR #2833: 2263 New named record types
- 2.8. PR #2832: 2808 strip-space option: fn:doc vs. fn:parse-xml
- 2.9. PR #2824: 2823 fn:scan: an alternative attempt
- 2.10. PR #2822: 2821 XHTML prefix normalization rules lead to xmlns="" namespace undeclarations
- 2.11. PR #2805: 2802 Function identity removed
- 3. Any other business
Summary of new and continuing actions [0/7]
[ ]QT4CG-143-02: MK to try to recover the ability to extract formal equivalences into tests[ ]QT4CG-167-03: NW to make a PR for #2482, fallback on bin:decode-string[ ]QT4CG-167-05: MK to write a proposal to change #2393 so the functions return JNodes[ ]QT4CG-167-07: NW to review tests for interpolated strings with edge cases in mind[ ]QT4CG-167-09: NW to close all “nice to have” issues at the end of October if they haven’t progressed[ ]QT4CG-170-01: RD to draft a proposal that attempts to address the lexical issues differently.[ ]QT4CG-174-01: MK to make an issue or otherwise address CG’s comments on #2734.[ ]QT4CG-176-01: NW to see about improving the linking for record types.[ ]QT4CG-176-02: MK to refine the strip-space option so that it takes account of historical defaults.
Draft Minutes
1. Administrivia
1.1. Roll call [9/11]
JLO gives regrets.
[X]David J Birnbaum (DB)[ ]Reece Dunn (RD)[X]Christian Grün (CG)[X]Joel Kalvesmaki (JK) [:06-][X]Michael Kay (MK)[ ]Juri Leino (JLO)[X]John Lumley (JWL)[X]Alan Painter (AP)[X]Wendell Piez (WP)[X]Bethan Tovey-Walsh (BTW)[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 25 August.
DB gives regrets.
1.5. Review of open action items [0/6]
[ ]QT4CG-143-02: MK to try to recover the ability to extract formal equivalences into tests[ ]QT4CG-167-03: NW to make a PR for #2482, fallback on bin:decode-string[ ]QT4CG-167-05: MK to write a proposal to change #2393 so the functions return JNodes[ ]QT4CG-167-07: NW to review tests for interpolated strings with edge cases in mind[ ]QT4CG-167-09: NW to close all “nice to have” issues at the end of October if they haven’t progressed[ ]QT4CG-170-01: RD to draft a proposal that attempts to address the lexical issues differently.[ ]QT4CG-174-01: MK to make an issue or otherwise address CG’s comments on #2734.
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. 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.
Proposal: accept without discussion.
Accepted.
2. Technical agenda
Doing the recent PRs first this week.
2.1. PR #2831: 2809 fn:deep-equal, debug option: nondeterminism
See PR #2831.
- MK: The proposal is to mark the function as non-deterministic if the
debugis true. But determinism is a property of the function, not a runtime choice. This is fuzzing things a bit.- … Implementations can still do it, but if we want to do this, we should do it more broadly.
- CG: I think we already have to make this change because
fn:dochas similar properties. - MK: Yep.
- CG: I’ve seen this in real examples where a static compilation overrode the users debug setting.
- MK: Do we leave this to implementors or do we try to formalize it? And if we formalize it properly.
- WP: Is this only about
debug? - CG: Yes.
- WP: I think MK is correct, those issues can be called out as points for implementors to work.
- … If we do it, we have to do it right.
- CG: That’s what I think.
NW oberves we don’t have consensus.
- MK: I think a note suggesting that implementors look at this carefully.
2.2. PR #2841: 2838 rename decode-from-uri as decode-uri
See PR #2841
- MK: Second thoughts on this as a result of discussion.
- … My initial feeling was that decode is a transitive verb and what you’re decoding is a URI.
- … Bug CG observed that the URI spec says you should parse a URI and then decode it’s parts.
- … Do we really need decode-uri, given that we have parse-uri?
- MK: After all that discussion, I think my instinct is to withdraw the PR.
- CG: We introduce this function three years ago and it’s widely used.
- … When we introduced parse-uri, people were asking for decoding
- … I don’t think it’s a problem decoding full URIs.
Proposal: close this PR without action.
Accepted.
2.3. PR #2842: 2801 Align the output of matching-segments() and regex-groups()
See PR #2842
- MK: There were some editorial comments that I’ve fixed shortly before the meeting.
- MK: The PR is about consistence between F&O and XSLT.
- MK: In F&O:
- … The example expresses what we’re doing. the group is now expressed as a record that contains the string value, the position of the group, the group number and the group name.
- … The number is redundant, but it’s the key. But you will still have them available.
- … The PR only effects the definition of ~fn:matching-segment-record.
- … Groups now contains a sequence of capture group records.
- MK: In XSLT:
- … Regex groups now uses the same captured group record and refers to it with a cross-spec link.
- NW: I don’t much like
nr; we haven’t generally used cryptic abbreviations. - MK: I called it
nrbecause that appears as an attribute name as an output of the analyze string function. - NW: Okay, I failed to notice at the time.
Proposal: accept the PR
Accepted.
2.4. PR #2840: 2825 Generalize fn:jtree to accept any value as input
See PR #2840
- MK: Let’s take that along with the one on array and array-members.
2.5. PR #2839: 2836 Add fn:location function
See PR #2839
- MK: The motivation for this is that I was working with the XSD validator
function. That gives you a function that validates a single node. It suggests
that you can get information about the location of validation errors.
- … But we have no way of asking when parsing the tree that they should retain that information.
- … I don’t think implementations in general want to maintain location information on every parsed document.
- … It’s typically a little bit expensive.
- MK: I’ve proposed that the
docandparse-xmlfunctions should have options to retain it.- … I’ve added properties to the data model
- … And a function to retreive that information, if it’s available.
- MK: In the Data Model:
- … We have a
locationaccessor that returns public and system identifiers and line and column. - … The actual values returned may differ.
- … It’s not interoperable across implementations.
- … We have a
- MK: In F&O:
- … There’s a new
fn:locationfunction that returns a location record, with similar caveats. - … And there’s a new
fn:location-record
- … There’s a new
- MK: I’ve defined it as
positiveInteger, we’re a little inconsistent about that.- … But this forbids zero.
- MK: There was a comment that copying the node shouldn’t copy it’s location. I’ve added that.
- JWL: Is there any runtime mechanism that would allow you to tell if you were going to get location?
- MK: No, you try and get an empty sequence back.
- JK: Having had to write one of these function myself, I’m pleased to see it added.
- … I wonder if it’s worth noting that the column count might be effected by entities
- … Is it worth providing an implementation-defined field that attempts to identify the parser?
- NW: I don’t think that’s practical, the APIs don’t really reveal it.
- MK: Yes, entities cause all sorts of complexity. Entities don’t reveal things like where the attributes are.
- … But we can’t legislate here because we don’t know what the parser is going to do.
- CG: I think many people will be grateful for it.
- … I think it would be helpful to raise an error if location information is requested and it isn’t available.
- MK: The trouble is that it’s only partially available: for elements but not attributes, lines but not columns, etc.
- MK: With respect to making it an error, I think that’s difficult.
- CG: With regard to positive integer, I’d rather see integer there. It may be easier for implementors to optimize this.
Proposal: accept the PR
Accepted.
2.6. PR #2834: 2830 Clarify the effect of the line-ending serialization parameter
See PR #2834
- MK: This one is purely editorial. Well, except in the sense that it defines some edge cases.
- MK: It’s entirely in the serialization spec.
- MK: First, we update the
item-separatorproperty.- … We note that it’s treated like any other character, they aren’t treated specially.
- … So if the item separator is \n and the line ending is \r\n, then you’ll get \r\n.
- MK: Line ending adjustment is now introduced as a separate phase.
- … That makes it much clearer when you do the adjustments and what is effected.
- MK: There’s a note that tries to be a bit more precise about the meaning of
indent-unit. - MK: In
indent-attributes, we add a note that we aren’t going to be entirely prescriptive. - MK: For JSON output, we say that we aren’t really going to tell you how to use
indent-unit. There’s a lot of variation.- … There’s a note that points out that
line-endingonly applies to inserted ones. All the others will be\nalready.
- … There’s a note that points out that
Proposal: accept the PR
Accepted.
2.7. PR #2833: 2263 New named record types
See PR #2833
- CG: This one is editorial. The issue was that various record types had not been named yet.
- … For example,
fn:divide-decimals.
- … For example,
- CG: We also have parameter types as well.
- CG: The biggest change is
fn:sort-by, mostly the signature becomes more readable. - CG: The other changes are trivial.
- CG:
fn:divide-decimalsand a few other functions now return record types. - MK: There’s an editorial comment that we really ought to find a way to do better linking.
ACTION: NW to see about improving the linking for record types.
Proposal: accept the PR
Accepted.
2.8. PR #2832: 2808 strip-space option: fn:doc vs. fn:parse-xml
See PR #2832
- CG: The proposal is to change the options for
fn:docandfn:parse-xmlto be enums. - CG: I introduced the same enum, but as JK noted it’s confusing.
conditionalmakes no sense forparse-xml.
- CG: I’m torn. Maybe we could drop conditional and only offer all and none.
- MK: My instinct is to make the parse-xml function and doc symmetric so that it works for both.
- … It just seems more othogonal that way.
- CG: Would it be sufficient to adopt the descriptions as is?
- MK: Probably the only thing is that for backwards compatibility, the default migth be different in the two case.
ACTION: MK to refine the strip-space option so that it takes account of historical defaults.
Proposal: accept the PR
Accepted.
2.9. PR #2824: 2823 fn:scan: an alternative attempt
See PR #2824
- CG: This one has a long history.
It’s related to generator functions and we will have to come back to those proposals soon.
- CG: There are new examples that help to explain why it’s useful.
- … The interesting thing is that scan can be composed with take-while.
- … So it’s easier to use than fold-left or fold-right.
- CG: Scan is iterative by nature so you can more easily optimize it.
- … We only need the left variant. It cannot be optimized the same way in fold-right.
- JWL: Can you go back to the usr/local/bin example.
- … So the result should be a sequence of arrays, shouldn’t it?
- CG: Because of the
! ?*, it will be a sequence. - JWL: Right. I didn’t spot that. Might be worth a note.
- CG: In the beginning I was against introducing the arrays, but DN convinced me it was a good idea.
- MK: Following on from John’s comment, does the
!operator in those examples do anything? - CG: Mmmm, maybe it would work without.
Proposal: accept the PR
Accepted.
2.10. PR #2822: 2821 XHTML prefix normalization rules lead to xmlns="" namespace undeclarations
See PR #2822
- MK: This is actually a bug in the 3.1 specification. It arose as the result of a Saxon bug report.
- MK: Prefix normalization effects the XHTML output method. It’s a consequence of the fact that serialization drops the namespace for MathML and SVG.
- MK: The rules talk about how that’s done. You drop the prefix and rename the node and drop the namespace nodes.
- … But it said you drop the namespace nodes including the default namespace, that results in
xmlns=""in the output.
- … But it said you drop the namespace nodes including the default namespace, that results in
- MK: I’ve dropped the XSLT example because it didn’t work.
- MK: The substantive change is that it now says it drops any namespace node that has a prefix.
Proposal: accept the PR
Accepted.
2.11. PR #2805: 2802 Function identity removed
See PR #2805
- CG: We’ve introduced function identity a while ago. We have a function
fn:function-identitythat gives you a string. - CG: The problem is that if you keep function identity, you have to define a lot of functions as nondeterminstics. Basically, all the functions that return functions.
- CG: Do we really need this? It’s very implementation defined, but in most cases it’ll be surprising.
- CG: We’re left with the
fn:deep-equalfunction. It can currently compare functions inside maps and arrays.- … We could always return true or false, but I think it would be better to raise an error.
- … But we could add an option to ignore function items.
- CG: It will have effects on the definition of
jtreebecause there’s a lot of discussion about how functions change the identities. - CG: I think the result will be simpler.
- MK: The case I care about is
fn:deep-equal. In particular, deep equal of records an in particular records that contain methods.- … If you have a record that has a has a function as the default value, then two calls to its constructor should be deep-equal if they have the same data fields.
- MK: That only works if you have some kind of concept of “same method” which means that “same method” means something.
- MK: I’d like to de-emphasize function identity in other places, I still think we need to handle that case.
- CG: I think the main challenge will be to define what an optimizer is allowed to do and not allowed to do.
- … (There’s an example in the issue that shows some consequences of optimizer rewriting.)
- WP: Identity and equality aren’t problems we’re going to solve.
More discussion required.
3. Any other business
None heard.