Martin Honnen created XALANJ-2715:
-------------------------------------
Summary: for-each-group where group-by expression returns a
sequence of more than one item gives wrong result
Key: XALANJ-2715
URL: https://issues.apache.org/jira/browse/XALANJ-2715
Project: XalanJ2
Issue Type: Bug
Security Level: No security risk; visible to anyone (Ordinary problems in
Xalan projects. Anybody can view the issue.)
Components: transformation, Xalan, Xalan-CmdLine
Affects Versions: The Latest Development Code
Reporter: Martin Honnen
Assignee: Gary D. Gregory
Attachments: group-by-to-multiple-groups.xsl, titles.xml
This is a bug report on the XSLT 3 branch
[https://github.com/apache/xalan-java/tree/xalan-j_xslt3.0|https://github.com/apache/xalan-java/tree/xalan-j_xslt3.0.]
In XSLT 2/3, the group-by expression can evaluate to a sequence of more than
one item, if, for a certain item in the grouping population, a sequence of more
than item is returned by the group by expression, than that items has to be
inserted in each group formed by one of the grouping keys returned by the
group-by expression.
To cite [https://www.w3.org/TR/xslt-30/#xsl-for-each-group:]
If the {{group-by}} attribute is present, and if the {{composite}} attribute is
omitted or takes the value {{{}no{}}}, then an item in the population may have
multiple grouping keys: that is, the {{group-by}} expression evaluates to a
sequence, and each item in the sequence is treated as a separate grouping key.
The item is included in as many groups as there are distinct grouping keys
(which may be zero).
The current XSLT 3 branch of Xalan doesn't seem to take that into account, it
seems an item in the grouping population is put into exactly one group, even if
its group-by expression returns a set of multiple, distinct grouping keys.
Test case (in parts taken from
[https://www.w3.org/TR/xslt-30/#grouping-examples):]
Input XML:
{code:java}
<titles>
<title>A Beginner's Guide to <ix>Java</ix></title>
<title>Learning <ix>XML</ix></title>
<title>Using <ix>XML</ix> with <ix>Java</ix></title>
</titles>{code}
XSLT code:
{code:java}
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:output indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title>XSLT 3.0 group-by to multiple groups</title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="titles">
<xsl:for-each-group select="title" group-by="ix">
<h2><xsl:value-of select="current-grouping-key()"/></h2>
<xsl:for-each select="current-group()">
<p><xsl:value-of select="."/></p>
</xsl:for-each>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
{code}
Result with Xalan XSLT 3.0 branch:
{code:java}
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>XSLT 3.0 group-by to multiple groups</title>
</head>
<body>
<h2>Java</h2>
<p>A Beginner's Guide to Java</p>
<h2>XML</h2>
<p>Learning XML</p>
<p>Using XML with Java</p>
</body>
</html>{code}
Expected result:
{code:java}
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>XSLT 3.0 group-by to multiple groups</title>
</head>
<body>
<h2>Java</h2>
<p>A Beginner's Guide to Java</p>
<p>Using XML with Java</p>
<h2>XML</h2>
<p>Learning XML</p>
<p>Using XML with Java</p>
</body>
</html>{code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]