@qt4cg statuses
This page displays recent status updates about the QT4CG project.
The are also captured in an RSS feed.
By year: 2026, 2025, 2024, 2023, 2022, 2021, 2020
QT4 CG meeting 170 draft agenda #agenda-06-30
Draft agenda published.
Pull request #2739 created #created-2739
2738 XSLT - tree terminology
Fix #2738
Gently improves the introductory sections of the XSLT spec to better reflect the introduction of JTrees and JNodes.
It could do with a more radical overhaul but this is a step in the right direction.
Issue #2738 created #created-2738
XSLT Concepts: "tree", "document"
In the XSLT Concepts section and elsewhere, the terms "tree" and "document" are used without saying explicitly whether the terms include or exclude JTrees. Some of the statements that are made about trees are equally applicable to XTrees and JTrees, while others are specific to XTrees. Because the definitions are unclear, the use of these terms throughout the spec is also unclear. This extends to the XSLT Streaming spec.
Issue #2684 closed #closed-2684
strip-space option in fn:doc vs fn:document
Issue #2737 created #created-2737
context (or tunnel) parameters
I would like to propose an idea to introduce context parameters. The goal is to allow to pass parameter in a scope rather than globally or inside of a whole template.
The idea is like this:
<xsl:param name="my-var" as="xs:string" context="yes"/>
or even
<xsl:param name="my-var" as="xs:string" tunnel="yes"/>
...
<xsl:function name="t:my-function" as="xs:string">
...
<xsl:sequence select="$my-var"/>
</xsl:function>
....
<xsl:context>
<xsl:with-param name="my-var" select="'123'"/>
... do something, e.g.:
<xsl:sequence select="t:my-function(...)"/>
</xsl:context>
This feature will closely resemble what java and node have with async scoped variables. See https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/ScopedValue.html See https://nodejs.org/api/async_context.html
Pull request #2736 created #created-2736
2169 Reformulate `StringInterpolation` to remove the `` `{ `` and `` }` `` literal terminals
Reformulates StringInterpolation as proposed and discussed in #2169.
Closes #2169
Issue #2735 created #created-2735
JNodes: serialization
We should improve the representation of JNodes with the standard xml and json serialization methods. Keys are simply lost in the output, which is particularly troubling for newcomers:
(: query :)
<xml><city>Roma</city><name>Andrea</name></xml>/* ,
{ 'city': 'Roma', 'name': 'Andrea' }/*
(: result :)
<city>Roma</city>
<name>Andrea</name>
Roma
Andrea
My suggestion would be to output (non-root) JNodes as single-entry maps:
{ 'a': 1, 'b': 2 }/*
{ "a": 1 }
{ "b": 2 }
[ 'a', ('b', 'c') ]/*
[ 1: 'a' ]
[ 2: ('b', 'c') ]
An alternative for JNodes that result from arrays could be the representation as a single-member array (XML nodes don’t include indexes either):
[ 'a', ('b', 'c') ]/*
[ 'a' ]
[ ('b', 'c') ]
Pull request #2734 created #created-2734
2733 A step too far
Fix #2733
Changes the rules for the path operator E1/E2 where E1 selects JNode and E2 evaluates to an atomic value. This now performs context-based mapping, in the normal style for "/", except in the case where E2 is a literal or variable reference, in which case it expands to E1/child::{E2}.
Issue #2733 created #created-2733
A step too far: path expressions involving JNodes
It's really great to be able to write expressions like booklist/book[author='Mike']/price but there are usability traps. Consider this test case:
<test-case name="K2-Steps-40">
<description>
RHS of "/" operator can be any PostfixExpr.
LHS of dynamic function call is coerced from JNode to function(*)*
</description>
<created by="Michael Kay" on="2026-04-24"/>
<dependency type="spec" value="XP40+ XQ40+"/>
<test>{"A":1, "B":{"C":3, "D":4}}/B/.("C")</test>
<result>
<assert-eq>3</assert-eq>
</result>
</test-case>
The test is wrong: can you see why? The answer is that it successfully evaluates the final step .("C") to obtain the value 3, but it doesn't return 3 as the final result of the expression, rather it computes {"A":1, "B":{"C":3, "D":4}}/B/3 which returns nothing.
I'm coming to the view that this isn't acceptable. The semantics of G/A where G evaluates to a GNode and A evaluates to an atomic value are wildly different depending on whether G is an XNode or a JNode, and this is going to cause no end of confusion.
A possible solution is to allow the current semantics only in the case where the step is an NCName or a literal. If it's anthing else, for example a variable reference, you have to write G/child::{$i}. If A is any expression other than an NCName or a literal, then G/A works with JNodes the same as it does with XNodes - the "/" operator is essentially treated as "!".
We're still breaking referential transparency; writing 23 has a different effect from using a variable whose value is 23. That's essentially because "/" was never a pure operator in the first place, there have always been surprises in its semantics.
Pull request #2732 created #created-2732
2708 Obsolete references to maps being unordered
Fix #2708
Pull request #2731 created #created-2731
2709 Well-formed sub-documents (2nd attempt)
Fix #2709
(at least in part...)
In most of the parts making up the XPath and XQuery spec (with the exceptions of front and back matter), I have made the document well-formed by (a) adding a wrapper fascicle element where necessary (and declaring this in the DTD), and (b) eliminating external entity and character references that depend on the internal DTD subset.
The &language; entity reference is replaced by the processing instruction <?inject language?>
I have modified the assemble-specs stylesheet to:
- shallow-skip the
fascicleelement - expand the
<?inject?>processing instruction
Issue #2730 closed #closed-2730
2709 Make well formed subdocuments
Pull request #2730 created #created-2730
2709 Make well formed subdocuments
Fix #2709
(at least in part...)
In most of the parts making up the XPath and XQuery spec (with the exceptions of front and back matter), I have made the document well-formed by (a) adding a wrapper fascicle element where necessary (and declaring this in the DTD), and (b) eliminating external entity and character references that depend on the internal DTD subset.
The &language; entity reference is replaced by the processing instruction <?inject language?>
I have modified the assemble-specs stylesheet to:
- shallow-skip the
fascicleelement - expand the
<?inject?>processing instruction
Issue #2728 closed #closed-2728
test-pr
Issue #2729 created #created-2729
fn:replace: named capture groups
See https://github.com/qt4cg/qtspecs/pull/2717#issuecomment-4802675128:
In a replacement string, I suggest the syntax
$<group-name>. In a replacement function (which is new in 4.0), I suggest we make the second argument a map of groups rather than a sequence of groups.
Issue #2723 closed #closed-2723
Another PR test; don't merge this one either
Issue #2725 closed #closed-2725
Moar testing
Issue #2726 closed #closed-2726
Why aren't actions running for my other tests?
Pull request #2728 created #created-2728
test-pr
Issue #2727 closed #closed-2727
Switch back to previous trigger
Pull request #2727 created #created-2727
Switch back to previous trigger
Pull request #2726 created #created-2726
Why aren't actions running for my other tests?
Pull request #2725 created #created-2725
Moar testing
Issue #2724 closed #closed-2724
Never merge this, more testing
Pull request #2724 created #created-2724
Never merge this, more testing
Is it not working because I did it wrong, or because GitHub infrastructure is collapsing? Who can tell?
Pull request #2723 created #created-2723
Another PR test; don't merge this one either
Issue #2722 closed #closed-2722
Pointless PR test; do not merge
Pull request #2722 created #created-2722
Pointless PR test; do not merge
Issue #2721 closed #closed-2721
Try pull_request instead of pull_request_target for PR builds
Pull request #2721 created #created-2721
Try pull_request instead of pull_request_target for PR builds
See https://github.blog/changelog/2026-06-18-safer-pull_request_target-defaults-for-github-actions-checkout/
See 5623 more statuses in yearly archives.