It's hard to say which is better as the two suggested fragments do very different things so it depends what the intended result is.
<xsl:template match="A/B/C/D/Q or J/K/L/M/Q or W/X/Y/Z/Q"/>
is a syntax error it should be
<xsl:template match="A/B/C/D/Q | J/K/L/M/Q | W/X/Y/Z/Q"/>
Or probably more efficiently (but not equivalent in general)
<xsl:template match="Q"/>
So once the error is fixed, sample B
will do a walk over the tree in depth first order applying the default template to every node so in particular copying all text to the output until it gets to Q
element nodes where it will prune the traversal and not copy Q
or its descendants to the result tree.
Sample A in complete contrast does not traverse the tree in depth first document order at all, and first processes A/B/C/D
nodes, in particular it does not process any other children of A
or B
or C
at this stage so any text node descendants of those children are not copied to the output. Then it will start a depth first traversal starting at D, pruning Q
as before. The process then starts again with J/K/L/M"
so any output from M
will be output after the output from D
even if M
occurs earlier in the source. This is in contrast to sample B
where the result order reflects the order in the input.
It's probably an artefact of the minimal example but if the input is a well formed document only one of the three apply templates in sample A can produce any result as /
can only have a single element child child so at least two of A
J
W
must select nothing.