xsl-list
[Top] [All Lists]

Re: [xsl] mixed content grouping by whitespace

2010-04-13 12:10:49
On 13/04/2010 17:45, G. Ken Holman wrote:

As I see it and have no problems remembering it:

group-by and group-adjacent are based on values,
group-starting-with and group-ending-with are based on names.

yes but that is still arbitrary. the difference betwen group-by and group-starting with is (to me) mainly that in the former you re-order the items to put them in groups, but in the latter you do not, and you just partition the input sequence without re-ordering. Why should the choice between ordering and not ordering be tied to names/values?
> ...

I'm not really sure what you are trying to say there, David. And in what
you are trying to say are you accommodating the feature of using a
sequence in group-by= in order to place a single population member into
more than one group simultaneously? I need to include a running example
of that in the classroom to help convey that concept to students.


The following has two variables, one holding nodes and the other numbers. I can group the nodes into heading or not heading with almost identical code to grouping the numbers into even or odd. Just use appropriate predicates.

However if i don't want to re-order things get harder. For nodes I can make a group starting with each heading, but how do you easily partition the integers into groups starting at each 0? If group-starting-with took a boolean expression rather than a pattern it would be a lot easier, see the commented out code at the end.

David


$ saxon9 -it main grp.xsl
<?xml version="1.0" encoding="UTF-8"?>
<grouping-nodes>
   <group>
      <h2>heading 1</h2>
      <h2>heading 2</h2>
   </group>
   <group>
      <p> para 1.1</p>
      <p> para 1.2</p>
      <p> para 2.1</p>
      <p> para 2.2</p>
   </group>
</grouping-nodes>
<grouping-items>
   <group>0 2 0 4</group>
   <group>1 3</group>
</grouping-items>
<grouping-nodes-without-reordering>
   <group>
      <h2>heading 1</h2>
      <p> para 1.1</p>
      <p> para 1.2</p>
   </group>
   <group>
      <h2>heading 2</h2>
      <p> para 2.1</p>
      <p> para 2.2</p>
   </group>
</grouping-nodes-without-reordering>






<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

<xsl:output indent="yes"/>

<xsl:variable name="x">
<h2>heading 1</h2>
<p> para 1.1</p>
<p> para 1.2</p>
<h2>heading 2</h2>
<p> para 2.1</p>
<p> para 2.2</p>
</xsl:variable>

<xsl:variable name="y" select="0,1,2,0,3,4"/>

<xsl:template name="main">

<grouping-nodes>
<xsl:for-each-group select="$x/*" group-by="exists(self::h2)">
<group>
<xsl:copy-of select="current-group()"/>
</group>
</xsl:for-each-group>
</grouping-nodes>

<grouping-items>
<xsl:for-each-group select="$y" group-by=". mod 2 = 0">
<group>
<xsl:copy-of select="current-group()"/>
</group>
</xsl:for-each-group>
</grouping-items>



<grouping-nodes-without-reordering>
<xsl:for-each-group select="$x/*" group-starting-with="h2">
<group>
<xsl:copy-of select="current-group()"/>
</group>
</xsl:for-each-group>
</grouping-nodes-without-reordering>

<!-- error
<grouping-nodes-without-reordering>
<xsl:for-each-group select="$y" group-starting-with="0">
<group>
<xsl:copy-of select="current-group()"/>
</group>
</xsl:for-each-group>
</grouping-nodes-without-reordering>

-->

<!-- david C-s ideal world The above woul dnot be an error and
group-starting-with would take an expression not a match, and the group would start whenever the expression was true.
so to do nodes you would have to do self::h2 as in the group-by example
(or with exists() for extra clarity rather than relying on implict boolean conversion)


<grouping-nodes-without-reordering>
<xsl:for-each-group select="$x/*" group-starting-with="exists(self::h2)">
<group>
<xsl:copy-of select="current-group()"/>
</group>
</xsl:for-each-group>
</grouping-nodes-without-reordering>


-->
</xsl:template>


</xsl:stylesheet>

________________________________________________________________________
The Numerical Algorithms Group Ltd is a company registered in England
and Wales with company number 1249803. The registered office is:
Wilkinson House, Jordan Hill Road, Oxford OX2 8DR, United Kingdom.

This e-mail has been scanned for all viruses by Star. The service is
powered by MessageLabs. ________________________________________________________________________

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--