I am wondering how one would write the identity transformation template
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
in an XSLT 3.0 stylesheet supposed to work with streaming. The section
http://www.w3.org/TR/xslt-30/#built-in-templates-shallow-copy in the
XSLT 3.0 specification has a template
<xsl:template match="." mode="M">
<xsl:copy validation="preserve">
<xsl:apply-templates select="@*" mode="M"/>
<xsl:apply-templates select="node()" mode="M"/>
</xsl:copy>
</xsl:template>
and explains "A further reason for choosing this form is for
streamability: this formulation is guaranteed-streamable".
However, when I try
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:mode streamable="yes"/>
<xsl:template match=".">
<xsl:copy validation="preserve">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
with Saxon 9.6 EE I get a compilation error saying:
Error at xsl:template on line 8 column 25 of test2015012505.xsl:
XTSE3430: Template rule is declared streamable but it does not
satisfy the streamability rules.
* In a streaming apply-templates instruction, the select expression
cannot select
ancestors or attributes (that is, it must not have climbing posture)
So how would one write a template doing a shallow copy and then
processing any attribute and child nodes in a streaming way?
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--