- From: Saašha Metsärantala <saasha@acc.umu.se>
- Date: Thu, 12 May 2011 21:47:54 +0200 (CEST)
- To: public-qt-comments@w3.org
Hello!
I suggest the introduction of two new elements in XSLT 2.1:
xsl:bag-variable and xsl:gather-unordered-in-bag
Both of these new elements are stream friendly and fork friendly. Their
names could be shortened (xsl:bag and xsl:gather, for example) or
otherwise changed, but I choose to write xsl:bag-variable and
xsl:gather-unordered-in-bag for clarity.
The aim is to simplify many XSLT transformations and to avoid the need to
parse the same (or similar) information several times.
In the following pseudocode, I describe a way to "gather" elements in a
bag during the transformation process during which the first (main) part
of the output is created. The elements gathered in the bag are unordered
(or in an unpredictable order). Thereafter (parts of) (the information
contained in) those gathered elements may be written towards the end of
the output. No attempt is made to predict the order of the elements as
they are gathered in the bag. When the bag is "full", (i.e. all elements
that should be gathered are in the bag), it should be possible to xsl:sort
those elements before they are written to output.
Of course, the exact syntax could be discussed. Here, I write a pseudocode
snippet to show how these new elements COULD work:
************* Pseudocode begins here! *************
xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ex="http://example.org/" version="2.1"
xsl:output method="xml" /
xsl:bag-variable name="basket" /
Now, the bag namned "basket" is created. This bag will be used to gather ex:foo and ex:baz elements.
xsl:template match="/"
some code
xsl:call-template /
more code
xsl:apply-templates /
more code
ex:foos-and-baz ex:quantity="{count($basket)}"
This was the start tag of the container for the ex:foo and ex:bag elements
as they are written to output. The attribute ex:quantity is also set.
xsl:copy-of select="$basket"
This was a somewhat new way to use the xsl:copy-of element
xsl:sort collation="http://example.net/my-collation" /
if the xsl:sort element above is omitted, then the ex:foo and ex:baz
elements occur in an unpredictable order within the ex:foos-and-baz
element. Alternatively, a default sorting could be applied.
/xsl:copy-of
/ex:foos-and-baz
/xsl:template
The main template is ending here.
xsl:template match="some-element"
lots of code and calculations, with (for example) xsl:for-each,
recursions, calls to several xsl:template elements, etc. ...
xsl:if test="something"
xsl:gather-unordered-in-bag name="basket"
ex:foo
some content for the ex:foo element
/ex:foo
/xsl:gather-unordered-in-bag
Now, one ex:foo element is added to the bag. Several other elements could be there.
/xsl:if
/xsl:template
xsl:template name="some-mame"
again lots of code and calculations, with (for example) xsl:for-each,
recursions, calls to several xsl:template elements, etc. ...
xsl:gather-unordered-in-bag name="basket"
ex:baz /
/xsl:gather-unordered-in-bag
Now, one ex:baz element is added to the bag. Several other elements could be there.
again lots of code and calculations, with (for example) xsl:for-each,
recursions, calls to several xsl:template elements, etc. ...
/xsl:template
Some more templates, some of which make use of the xsl:gather-unordered-in-bag element ...
/xsl:transform
************* Pseudocode ends here! *************
Possible extensions:
- Gathering not only element, but also attributes
- Gathering list elements. This could be achieved through an "as"
attribute on the xsl:bag-variable element (such as as="xs:list"). The
order of the list elements within the list would still be unpredictable.
These extensions would still be stream friendly and fork friendly.
Regards!
Saašha,
Received on Thursday, 12 May 2011 19:54:20 UTC