[xsl] Re: XSLT 3.0: What is the correct "Deep Skip" template rule code ?

Subject: [xsl] Re: XSLT 3.0: What is the correct "Deep Skip" template rule code ?
From: "Dimitre Novatchev dnovatchev@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 2 Jan 2015 22:10:25 -0000
Thank you, Dr. Kay,

> We made a conscious decision that deep-skip should work differently
> for document nodes, because it was found that otherwise,
> the effect of failing to supply an explicit template rule for the document
node
> was very bewildering. A built-in template rule for document nodes that skips
the whole document
> is simply not useful

I see the rationale behind this decision. I believe that this
explanation would be better included in the document.

> it has to be overridden.

Some use cases come to mind immediately, where skipping document nodes
would be convenient -- such as when wanting to process only certain
documents from a collection (as matched by the pattern of a specific
template) and filter out all the rest -- without having to write a
template for this filtering.

--
Cheers,
Dimitre Novatchev



On Fri, Jan 2, 2015 at 2:00 PM, Michael Kay <mike@xxxxxxxxxxxx> wrote:
> We made a conscious decision that deep-skip should work differently for
document nodes, because it was found that otherwise, the effect of failing to
supply an explicit template rule for the document node was very bewildering. A
built-in template rule for document nodes that skips the whole document is
simply not useful; it has to be overridden.
>
> The change was documented in item 27 of appendix K, though there is no link
to the rationale used.
>
> Michael Kay
> Saxonica
> mike@xxxxxxxxxxxx
> +44 (0) 118 946 5893
>
>
>
>
> On 2 Jan 2015, at 21:07, Dimitre Novatchev <dnovatchev@xxxxxxxxx> wrote:
>
>> Let me start with wishing to everyone a Happy and Safe New Year!
>>
>>
>> To continue with more routine, daily stuff :
>>
>> In section "6.7.4 Built-in Templates: Deep Skip" of the 2nd Last Call
>> of the W3C "XSLT 3.0" specification
>>
(http://www.w3.org/TR/2014/WD-xslt-30-20141002/#built-in-templates-deep-skip)
,
>> we read:
>>
>> 'The effect of processing a tree using a mode that specifies
>> on-no-match="deep-skip" is that where no explicit template rule is
>> specified for an element, that element and all its descendants are
>> ignored, and are not copied to the result tree.
>>
>> The effect of choosing on-no-match="deep-skip" is as follows:
>>
>> The built-in rule for document nodes is equivalent to calling
>> xsl:apply-templates with no select attribute, and with the mode
>> attribute set to #current. If the built-in rule was invoked with
>> parameters, those parameters are passed on in the implicit
>> xsl:apply-templates instruction.
>>
>> In the case where there are no parameters, this is equivalent to the
>> following rule:
>>
>> <xsl:template match="document-node()" mode="M">
>>  <xsl:apply-templates mode="#current"/>
>> </xsl:template>
>>
>> The built-in rule for all items other than document nodes (that is,
>> for all other kinds of node, as well as atomic values and functions,
>> including maps) is to do nothing, that is, to return an empty sequence
>> (without applying templates to any children or ancestors).
>>
>> This is equivalent to the following rule:
>>
>> <xsl:template match="." mode="M"/> '
>>
>>
>> This definition raises some questions:
>>
>> 1. Why should there be inside a "deep skip" template, an
>> <xsl:apply-templates> instruction?  If the purpose is really "deep
>> skip", isn't this most directly accomplished by:
>>
>>      <xsl:template match="document-node()" mode="M"/>
>>
>>    And why pass parameters, if they wouldn't be used at all?
>>
>> 2. Why are there two separate "deep skip" built-in templates -- one
>> for matching document nodes and one for matching any item? Why not
>> just have a single template that matches any item (document node
>> included):
>>
>>     <xsl:template match="." mode="M"/>
>>
>>
>>
>> --
>> Cheers,
>> Dimitre Novatchev

Current Thread