<?xml version="1.0" standalone="no"?>
<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
<!-- 
 * The Apache Software License, Version 1.1
 *
 *
 * Copyright (c) 2001 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Xalan" and "Apache Software Foundation" must
 *    not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache",
 *    nor may "Apache" appear in their name, without prior written
 *    permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation and was
 * originally based on software copyright (c) 2001, Sun
 * Microsystems., http://www.sun.com.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 -->
  <s1 title="&lt;xsl:comment&gt; / &lt;xsl:message&gt;">

  <ul>
  <li><link anchor="functionality">Functionality</link></li>
  <li><link anchor="implementation">Implementation</link></li>  
  </ul>
<anchor name="functionality"/>
<s2 title="Functionality">

  <p>The <code>&lt;xsl:comment&gt;</code> element is used to insert XML comments
  into the result document. The comment is inserted as follows in the XSL
  stylesheet:</p>

  <source>    &lt;element&gt;
      &lt;xsl:comment&gt;This is a comment!&lt;/xsl:comment&gt;
    &lt;/element&gt;</source>

  <p>and it will be output in the result document as follows:</p>

  <source>    &lt;element&gt;
      &lt;!-- This is a comment! --&gt;
    &lt;/element&gt;</source>

  <p>The <code>&lt;xsl:message&gt;</code> element is used to send messages to
  who/whatever is performing the transformation. The message can be displayed
  in a terminal, a dialog box, etc. The  <code>&lt;xsl:message&gt;</code> element
  is used in the same way as the <code>&lt;xsl:comment&gt;</code> element,
  however the message is <em>not</em> output in the result document.</p>

  <p>The <code>&lt;xsl:message&gt;</code> element has an attribute
  <code>"terminate"</code> which can be used to terminate the transformation at any
  given stage. This is useful when using message to give information about
  illegal values in the input document.</p>
</s2><anchor name="implementation"/>
<s2 title="Implementation">

  <p>The output handler class has a method for outputting comments in the
  output document and messages to the operator. The code compiled for a
  comment gathers all text that goes into the comment in a StringValueHandler
  object, retrieves the full text string from this handler, and then finally
  sends it to the output handler. Similarly the code compiled for a message
  will simply send the message to the output handler in use.</p>

  <p>Messages will be output to the terminal (stdout) when a transformation
  is run in a terminal. The message will be output before the beginning of the
  output document. Messages will be shown in a dialog box if a transformation
  is run in an applet.</p>

  <p><code>&lt;xsl:message&gt;</code> elements that use the <code>"terminate"</code>
  attribute to abort transformations cause an exception to be thrown. A
  RuntimeException is used for this, and the exception text is:</p>
  <p><code>Termination forced by an xsl:message instruction</code></p>
  </s2>
</s1>  
