Posts

Showing posts with the label streaming

Using accumulators to number items in a streamable way

Both in XSLT 1 and 2 you can use the powerful xsl:number instruction to count and number nodes. Of course, that instruction is also supported in XSLT 3 , however, if you want to use xsl:number with streaming then you will find that the streamability of that instruction is rather restricted:   xsl:number  can be used for formatting of numbers supplied directly using the  value  attribute, and also for numbering of nodes in a non-streamed document, but it cannot be used for numbering streamed nodes On the other hand, you will see in this article that using accumulators you can write a stylesheet to count and number nodes in XSLT 3 in a way that works with both streaming and non-streaming. As an example let's take a recent post on StackOverflow that wants to count and number the row and col elements in the input sample and transform it to a flat structure with the row  and col index as attributes on a data element: Using accumulators we ca...

Extracting sub trees of a document using snapshot()

In this post I will explore how the new snapshot function in XSLT 3.0 makes life easier with tasks like extracting sub trees from a document, for instance to split up a file into several, each containing a sub tree from the original file. So let's assume we have some input data as follows: and we want to split it up into several documents, each containing a page element in its sub tree, for instance: With XSLT 2.0 we would have to reconstruct the sub tree a page element is contained in, now with XSLT 3.0's snapshot function it is as easy as: So we simply process each page element and in the matching template we create a result document containing the sub tree of the page by using         <xsl:result-document href="pages/page{position()}.xml">             <xsl:copy-of select="root(snapshot())"/>         </xsl:result-document> It is also easy to adapt the stylesheet to work with...