/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
<html>
<head>
<title>FreeMarker: Transformation Test</title>
</head>
<body>

<p>A simple test follows:</p>

<p>Hello, world!</p>

&lt;p&gt;Hello, world!&lt;/p&gt;

<P>Now try the Utility package:</p>
<p>Utility transformations</p>

&lt;p&gt;Utility transformations&lt;/p&gt;

<p>Now some nested transforms:</p>
<p >This tests the compress transformation</p >&lt;p &gt;This tests the compress transformation&lt;/p &gt;&lt;p &gt;This tests the compress transformation&lt;/p &gt;
<p>Now try method and transform interactions:</p>
&lt;p&gt;This isn&apos;t a valid XML string.&lt;/p&gt;
&lt;p&gt;This isn't a valid HTML string.&lt;/p&gt;

<p>A more advanced interaction involves getting a TemplateMethodModel
to initialise a TemplateTransformModel, as follow:</p>

Comment: This is a comment

A test string containing quotes: "This isn't a test".
A test string containing amps: Fish & Chips.
A test string containing tags: <p>Fish &amp; Chips.</p>

Comment: This is a second comment

A test string containing quotes: &quot;This isn&apos;t a test&quot;.
A test string containing amps: Fish & Chips.
A test string containing tags: <p>Fish &amp; Chips.</p>
Comment: This is a third comment

A test string containing quotes: &quot;This isn&apos;t a test&quot;.
A test string containing amps: Fish &amp; Chips.
A test string containing tags: <p>Fish &amp;amp; Chips.</p>
Comment: Utility transformations

A test string containing quotes: "This isn't a test".
A test string containing amps: Fish & Chips.
A test string containing tags: &lt;p&gt;Fish &amp; Chips.&lt;/p&gt;


I saw the python. It was cool.

4
5
2

</body>
</html>
