0
votes

I'm working through my first XSL transformation using the apply-templates element. When developing XSLT, what is the best practice? Should I be very specific in the select of the apply-templates or in the match of the template or something I haven't considered?

Example A

<xsl:template match="/">
    <xsl:apply-templates select="A/B/C/D"/>
    <xsl:apply-templates select="J/K/L/M"/>
    <xsl:apply-templates select="W/X/Y/Z"/>
</xsl:template>

<xsl:template match="Q"/>

or

Example B

<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="A/B/C/D/Q or J/K/L/M/Q or W/X/Y/Z/Q"/>
2
As with all languages, there are trade-offs to be made between performance, extensibility and design simplicity. You need to say which of these has the highest priority.Sean B. Durkin
@Sean Good point. I was asking from a design simplicity standpoint. I was not aware that this would affect performance, so I'd be interested in how this affects performance as well.Dale

2 Answers

1
votes

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.

0
votes

In general, if you want to write a stylesheet that will still work when the source document structure changes, it's better to put the rules in the match patterns. Being selective in the select expressions is mainly useful when you want to process children in non-document order.