RE: [xsl] Omit Data While Using Copy

Subject: RE: [xsl] Omit Data While Using Copy
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Wed, 11 Aug 2004 17:25:40 -0400
Charles:

You asked for some clarification.

At 04:18 PM 8/11/2004, you wrote:
To get to the heart of your problem, when you don't specify a template to use in processing a node, the default template is applied. That built-in template copies the text value of an un-matched node to the output.

This is true only of text nodes, whose default template copies its value to the result. For element nodes, the default template simply applies templates to its children. Accordingly, the entire tree is traversed, with any text nodes copied out, which is why the text value of an unmatched node (providing none of its descendants match a template either) appears in output (whether it appeared in one text node or many in the source).


In this case, the text value of <titel>. By adding a "no-op" template that matches <titel>, the output will be suppressed:

<xsl:template match="titel" />

Right.


The next thing I noticed was that your template matches "kapitel/hanvisning". The <hanvisning> element has no child elements.

Correct. An apply-templates inside it will apply templates to its text node child (the default template if necessary). Note that its attribute is not a child and would not be selected for processing. But since the OP has value-of select="node()", the *value* of that text node is copied out (which is also what would happen by default).


A bug would emerge were there more than one text node inside the hanvisning, since value-of select="node()" will get us the value only of the first child node (the value of a node-set in XPath 1.0 being the value of the first node in the set in document order).

I am a little puzzled as to why the <titel> element is being processed. It is not a child of <hanvisning>. I had always thought that the default template was applied when <xsl:apply-templates /> is used, but it seems that is incorrect. Perhaps one of those better acquainted with the XSL spec can explain it to us.

The <titel> node is being picked up by the (defaulted) traversal of its parent, the <kapitel>, which is being processed (not matching otherwise) by the built-in template for elements, described above.


To clarify utterly (I hope), the default template is not applied when <xsl:apply-templates/> is used, but rather whenever a node is selected for processing (i.e. has templates applied to it) which does not match a template explicitly given. If your only template matches "kapitel/hanvisning", the default template will apply to the kapitel itself, as to the titel (its children are processed and text node descendants eventually copied across) and the "text" elements (which disappear since there's nothing inside them to copy).

Cheers,
Wendell

The source:

<?xml version="1.0"?>
<?xml:stylesheet type='text/xsl' href='manual.xsl'?>
<kapitel>
  <titel>Measures every 10 percussion hours</titel>
  <text/>
  <hanvisning from="ID(SEUHS-SLAGVT-10-MATARE13)">Feeder</hanvisning>
  <text/>
  <hanvisning
from="ID(SEUHS-SLAGVT-10-BOM19)">Boom</hanvisning>
  <text/>
</kapitel>



======================================================================
Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
  Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================

Current Thread