blob: 377fd8e7301dd33d7a92f89ccffb64c10e94e1f6 [file] [log] [blame]
<!doctype html>
<!-- Generated by FreeMarker/Docgen from DocBook -->
<html lang="en" class="page-type-section">
<head prefix="og: http://ogp.me/ns#">
<meta charset="utf-8">
<title>Details - Apache FreeMarker Manual</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="format-detection" content="telephone=no">
<meta property="og:site_name" content="Apache FreeMarker Manual">
<meta property="og:title" content="Details">
<meta property="og:locale" content="en_US">
<meta property="og:url" content="https://freemarker.apache.org/docs/xgui_imperative_formal.html">
<link rel="canonical" href="https://freemarker.apache.org/docs/xgui_imperative_formal.html">
<link rel="icon" href="favicon.png" type="image/png">
<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto:500,700,400,300|Droid+Sans+Mono">
<link rel="stylesheet" type="text/css" href="docgen-resources/docgen.min.css?1707770044859">
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/cookie-bar/cookiebar-latest.min.js"></script>
</head>
<body itemscope itemtype="https://schema.org/Code">
<meta itemprop="url" content="https://freemarker.apache.org/docs/">
<meta itemprop="name" content="Apache FreeMarker Manual">
<!--[if lte IE 9]>
<div class="oldBrowserWarning" style="display: block">
Unsupported web browser - Use a modern browser to view this website!
</div>
<![endif]--> <div class="oldBrowserWarning">
Unsupported web browser - Use a modern browser to view this website!
</div>
<div class="header-top-bg"><div class="site-width header-top"><div id="hamburger-menu" role="button"></div> <div class="logo">
<a href="https://freemarker.apache.org" role="banner"><img itemprop="image" src="logo.png" alt="FreeMarker"></a> </div>
<ul class="tabs"><li><a href="https://freemarker.apache.org/">Home</a></li><li class="current"><a href="index.html">Manual</a></li><li><a class="external" href="api/index.html">Java API</a></li></ul><ul class="secondary-tabs"><li><a class="tab icon-heart" href="https://freemarker.apache.org/contribute.html" title="Contribute"><span>Contribute</span></a></li><li><a class="tab icon-bug" href="https://issues.apache.org/jira/projects/FREEMARKER" title="Report a Bug"><span>Report a Bug</span></a></li><li><a class="tab icon-download" href="https://freemarker.apache.org/freemarkerdownload.html" title="Download"><span>Download</span></a></li></ul></div></div><div class="header-bottom-bg"><div class="site-width search-row"><a href="index.html" class="navigation-header">Manual</a><div class="navigation-header"></div><form method="get" class="search-form" action="search-results.html"><fieldset><legend class="sr-only">Search form</legend><label for="search-field" class="sr-only">Search query</label><input id="search-field" name="q" type="search" class="search-input" placeholder="Search" spellcheck="false" autocorrect="off" autocomplete="off"><button type="submit" class="search-btn"><span class="sr-only">Search</span></button></fieldset></form></div><div class="site-width breadcrumb-row"> <div class="breadcrumbs">
<ul class="breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList"><li class="step-0" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="index.html"><span itemprop="name">Apache FreeMarker Manual</span></a></li><li class="step-1" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="xgui.html"><span itemprop="name">XML Processing Guide</span></a></li><li class="step-2" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="xgui_imperative.html"><span itemprop="name">Imperative XML processing</span></a></li><li class="step-3" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="xgui_imperative_formal.html"><span itemprop="name">Details</span></a></li></ul> </div>
<div class="bookmarks" title="Bookmarks"><span class="sr-only">Bookmarks:</span><ul><li><a href="alphaidx.html">Alpha. index</a></li><li><a href="gloss.html">Glossary</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions</a></li><li><a href="ref_builtins_alphaidx.html">?builtins</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_specvar.html">.spec_vars</a></li><li><a href="app_faq.html">FAQ</a></li></ul></div></div></div> <div class="main-content site-width">
<div class="content-wrapper">
<div id="table-of-contents-wrapper" class="col-left">
<script>var breadcrumb = ["Apache FreeMarker Manual","XML Processing Guide","Imperative XML processing","Details"];</script>
<script src="toc.js?1707770044859"></script>
<script src="docgen-resources/main.min.js?1707770044859"></script>
</div>
<div class="col-right"><div class="page-content"><div class="page-title"><div class="pagers top"><a class="paging-arrow previous" href="xgui_imperative_learn.html"><span>Previous</span></a><a class="paging-arrow next" href="xgui_declarative.html"><span>Next</span></a></div><div class="title-wrapper">
<h1 class="content-header header-section1" id="xgui_imperative_formal" itemprop="headline">Details</h1>
</div></div><p>Every variable that corresponds to a single node in the DOM tree
is a multi-type variable of type node and type hash (for programmers:
implements both <code class="inline-code">TemplateNodeModel</code> and
<code class="inline-code">TemplateHashModel</code>). Thus, you can use the <a href="ref_builtins_node.html">node built-ins</a> with them. Hash keys
are interpreted as XPath expressions, except the special keys shown in
the table below. Some of the node variables also have string type, so
you can use them as string variables (for programmers: they implement
<code class="inline-code">TemplateScalarModel</code>).</p><a name="misc.xguiTable"></a> <div class="table-responsive">
<table class="table">
<thead>
<tr>
<th>Node type (<code class="inline-code">?node_type</code>)</th>
<th>Node name (<code class="inline-code">?node_name</code>)</th>
<th>String value (e.g. <code class="inline-code">&lt;p&gt;${node}</code>)</th>
<th>Special hash keys</th>
</tr>
</thead>
<tbody>
<tr>
<td><code class="inline-code">&quot;document&quot;</code></td>
<td><code class="inline-code">&quot;@document&quot;</code></td>
<td>No string value. (Error when you try to use it as
string.)</td>
<td><code class="inline-code"><em class="code-color">elementName</em></code>,
<code class="inline-code">&quot;<em class="code-color">prefix</em>:<em class="code-color">elementName</em>&quot;</code>,
<code class="inline-code">*</code>, <code class="inline-code">**</code>,
<code class="inline-code">@@markup</code>, <code class="inline-code">@@nested_markup</code>,
<code class="inline-code">@@text</code>, <code class="inline-code">@@local_name</code>,
<code class="inline-code">@@qname</code>, <code class="inline-code">@@namespace</code></td>
</tr>
<tr>
<td><code class="inline-code">&quot;element&quot;</code></td>
<td><code class="inline-code">&quot;<em class="code-color">name</em>&quot;</code>: the
name of the element. This is the local name (i.e. name without
namespace prefix).</td>
<td>If it has no element children, the text of all text node
children concatenated together. Error otherwise, when you try to
use it as string.</td>
<td><code class="inline-code"><em class="code-color">elementName</em></code>,
<code class="inline-code">&quot;<em class="code-color">prefix</em>:<em class="code-color">elementName</em>&quot;</code>,
<code class="inline-code">*</code>, <code class="inline-code">**</code>,
<code class="inline-code">@<em class="code-color">attrName</em></code>,
<code class="inline-code">&quot;@<em class="code-color">prefix</em>:<em class="code-color">attrName</em>&quot;</code>,
<code class="inline-code">@@</code>, <code class="inline-code">&quot;@*&quot;</code>,
<code class="inline-code">@@start_tag</code>, <code class="inline-code">@@end_tag</code>,
<code class="inline-code">@@attributes_markup</code>,
<code class="inline-code">@@next_sibling_element</code>,
<code class="inline-code">@@previous_sibling_element</code>,
<code class="inline-code">@@markup</code>, <code class="inline-code">@@nested_markup</code>,
<code class="inline-code">@@text</code>, <code class="inline-code">@@local_name</code>,
<code class="inline-code">@@qname</code>, <code class="inline-code">@@namespace</code></td>
</tr>
<tr>
<td><code class="inline-code">&quot;text&quot;</code></td>
<td><code class="inline-code">&quot;@text&quot;</code></td>
<td>The text itself.</td>
<td><code class="inline-code">@@markup</code>,
<code class="inline-code">@@nested_markup</code>, <code class="inline-code">@@text</code>,
<code class="inline-code">@@local_name</code>, <code class="inline-code">@@qname</code>,
<code class="inline-code">@@namespace</code></td>
</tr>
<tr>
<td><code class="inline-code">&quot;pi&quot;</code></td>
<td><code class="inline-code">&quot;@pi$<em class="code-color">target</em>&quot;</code></td>
<td>The part between the target name and the
<code class="inline-code">?&gt;</code>.</td>
<td><code class="inline-code">@@markup</code>,
<code class="inline-code">@@nested_markup</code>, <code class="inline-code">@@text</code>,
<code class="inline-code">@@local_name</code>, <code class="inline-code">@@qname</code>,
<code class="inline-code">@@namespace</code></td>
</tr>
<tr>
<td><code class="inline-code">&quot;comment&quot;</code></td>
<td><code class="inline-code">&quot;@comment&quot;</code></td>
<td>The text of the comment, without the delimiters
<code class="inline-code">&lt;!--</code> and <code class="inline-code">--&gt;</code>.</td>
<td><code class="inline-code">@@markup</code>,
<code class="inline-code">@@nested_markup</code>, <code class="inline-code">@@text</code>,
<code class="inline-code">@@local_name</code>, <code class="inline-code">@@qname</code>,
<code class="inline-code">@@namespace</code></td>
</tr>
<tr>
<td><code class="inline-code">&quot;attribute&quot;</code></td>
<td><code class="inline-code">&quot;<em class="code-color">name</em>&quot;</code>: the
name of the attribute. This is the local name (i.e. name without
namespace prefix).</td>
<td>The value of the attribute.</td>
<td><code class="inline-code">@@markup</code>,
<code class="inline-code">@@nested_markup</code>, <code class="inline-code">@@text</code>,
<code class="inline-code">@@qname</code>, <code class="inline-code">@@local_name</code>,
<code class="inline-code">@@qname</code>, <code class="inline-code">@@namespace</code></td>
</tr>
<tr>
<td><code class="inline-code">&quot;document_type&quot;</code></td>
<td><code class="inline-code">&quot;@document_type$<em class="code-color">name</em>&quot;</code>:
<code class="inline-code"><em class="code-color">name</em></code> is the name
of the document element.</td>
<td>No string value. (Error when you try to use it as
string.)</td>
<td><code class="inline-code">@@markup</code>,
<code class="inline-code">@@nested_markup</code>, <code class="inline-code">@@text</code>,
<code class="inline-code">@@local_name</code>, <code class="inline-code">@@qname</code>,
<code class="inline-code">@@namespace</code></td>
</tr>
</tbody>
</table>
</div>
<p>Notes:</p><ul>
<li>
<p>There is no CDATA type. CDATA nodes are transparently
considered as text nodes.</p>
</li>
<li>
<p>These variables do <em>not</em> support
<code class="inline-code">?keys</code> and <code class="inline-code">?values</code>.</p>
</li>
<li>
<p>Element and attribute node names are local names, that is,
they do not contain the namespace prefix. The URI of the namespace
the node belongs to can be queried with the
<code class="inline-code">?node_namespace</code> built-in.</p>
</li>
<li>
<p>XPath expression needs Jaxen (recommended, but please use
1.1-beta-8 or later; <a href="http://jaxen.org/">download
it here</a>) or Apache Xalan classes available, or an error
will stop template execution. Note, however, that as some special
hash keys hide the XPath expressions of the same meaning, those
XPath expressions will work even if there is no XPath
implementation available. <span class="marked-for-programmers">If both
Xalan and Jaxen is available, FreeMarker will use Xalan, unless
you choose Jaxen by calling
<code class="inline-code">freemarker.ext.dom.NodeModel.useJaxenXPathSupport()</code>
from Java.</span></p>
</li>
<li>
<p>If Jaxen is used for the XPath support (not Xalan), then
FreeMarker variables are visible with XPath variable references
(e.g.
<code class="inline-code">doc[&quot;book/chapter[title=$currentTitle]&quot;]</code>).</p>
</li>
</ul><p>Meaning of special hash keys:</p><ul>
<li>
<p><code class="inline-code"><em class="code-color">elementName</em></code>,
<code class="inline-code">&quot;<em class="code-color">prefix</em>:<em class="code-color">elementName</em>&quot;</code>:
Returns the sequence of child nodes that are elements of name
<code class="inline-code"><em class="code-color">elementName</em></code>. (Note
that the term "child" means
<em>immediate</em> descendant.) The selection is XML
name-space aware, unless the XML document was persed with an XML
parser that was not in namespace aware mode. In XML name-space
aware mode, names without prefix
(<em>elementName</em>) selects only elements
that doesn&#39;t belong to any XML name-space (unless you have
registered a default XML namespace), and names with prefix
(<em>prefix</em>:<em>elementName</em>)
selects only elements that are belonging to the XML namespace
denoted by the prefix. The registration of prefixes and the
setting of the default XML namespace is done with the
<code class="inline-code">ns_prefixes</code> parameter of the <a href="ref_directive_ftl.html#ref.directive.ftl"><code>ftl</code>
directive</a>.</p>
</li>
<li>
<p><code class="inline-code">*</code>: Returns the sequence of all child
(direct descendant) <em>element</em> nodes. The
sequence will contain the elements in the "document
order", that is, in the order in which the first character
of the XML representation of each node occurs (after expansion of
general entities).</p>
</li>
<li>
<p><code class="inline-code">**</code>: Returns the sequence of all
descendant <em>element</em> nodes. The sequence will
contain the elements in the document order.</p>
</li>
<li>
<p><code class="inline-code">@<em class="code-color">attName</em></code>,
<code class="inline-code">&quot;@<em class="code-color">prefix</em>:<em class="code-color">attrName</em>&quot;</code>:
Returns the attribute
<code class="inline-code"><em class="code-color">attName</em></code> of the
element as a sequence of size 1 that contains the attribute node,
or as an empty sequence if the attribute does not exist (so to
check if an attribute exists use
<code class="inline-code">foo.@<em class="code-color">attName</em>[0]??</code>,
<em>not</em>
<code class="inline-code">foo.@<em class="code-color">attName</em>??</code>). As
with special key
<code class="inline-code">&quot;<em class="code-color">elementName</em>&quot;</code>, if
the length of the sequence is 1, then it also acts as its first
subvariable. If no
<code class="inline-code"><em class="code-color">prefix</em></code> is used, then
it returns only attribute that does not use XML namespace (even if
you have set a default XML namespace). If a
<code class="inline-code"><em class="code-color">prefix</em></code> is used, it
returns only the attribute that belongs to the XML namespace
associated with the
<code class="inline-code"><em class="code-color">prefix</em></code>. The
registration of prefixes is done with the
<code class="inline-code">ns_prefixes</code> parameter of the <a href="ref_directive_ftl.html#ref.directive.ftl"><code>ftl</code>
directive</a>.</p>
</li>
<li>
<p><code class="inline-code">@@</code> or <code class="inline-code">&quot;@*&quot;</code>: Returns
the sequence of attribute nodes belonging to the parent element.
This is the same as XPath <code class="inline-code">@*</code>.</p>
</li>
<li>
<p><code class="inline-code">@@qname</code>: Returns the full-qualified name
of the element (such as <code class="inline-code">e:book</code>, in contrast to
the local name returned by <code class="inline-code">?node_name</code> that is
<code class="inline-code">book</code>) . The prefix used (as
<code class="inline-code">e</code>) is chosen based on the prefix registered in
the current namespace with the <code class="inline-code">ns_prefixes</code>
parameter of the <code class="inline-code">ftl</code> directive, and not
influenced by the prefix used in the source XML document. If you
have set a default XML namespace, then for nodes that use that,
prefix <code class="inline-code">D</code> will be used. For nodes that does not
belong to an XML namespace, no prefix is used (even if you have
set a default namespace). If there is no prefix registered for the
namespace of the node, the result is a non-existent variable
(<code class="inline-code">node.@@qname??</code> is
<code class="inline-code">false</code>).</p>
</li>
<li>
<p><code class="inline-code">@@local_mame</code>: The name of the node
without the namespace prefix.</p>
</li>
<li>
<p><code class="inline-code">@@namespace</code>: The namespace URL (not the
namespace prefix) of the node.</p>
</li>
<li>
<p><code class="inline-code">@@markup</code>: This returns the full XML
markup of a node, as a string. (Full XML markup means that it also
contains the markup of the child nodes, and the markup of the
children of the child nodes, and so on.) The markup you get is not
necessary the same as the markup in the source XML file, it&#39;s just
semantically identical. Especially, note that CDATA sections will
become to plain text. Also note that depending on how did you
wrapped the original XML document with FreeMarker, comment or
processing instruction nodes may were removed, and then they will
be missing from the output of course. The first outputted start
tag will contain
<code class="inline-code">xmlns:<em class="code-color">prefix</em></code>
attributes for each XML name-spaces used in the outputted XML
fragment, and those prefixes will be used in the outputted element
and attribute names. These prefixes will be the same as the
prefixes registered with the <code class="inline-code">ns_prefixes</code>
parameter of the <code class="inline-code">ftl</code> directive (no prefix will
be used for <code class="inline-code">D</code>, as it will be registered as the
default name-space with an <code class="inline-code">xmlns</code> attribute), or
if no prefix was assigned for a XML name-space with that, then an
arbitrary chosen unused prefix is used.</p>
</li>
<li>
<p><code class="inline-code">@@nested_markup</code>: This is similar to
<code class="inline-code">@@markup</code>, but it returns the XML markup of an
element without its opening and closing tags. For the document
node, it returns the same as <code class="inline-code">@@markup</code>. For
other node types (text, processing instruction, etc.), it returns
an empty string. Unlike with <code class="inline-code">@@markup</code>, no
<code class="inline-code">xmlns:<em class="code-color">prefix</em></code>
attributes will be placed into the output, but regarding the
prefixes used in element and attribute names the rules are the
same.</p>
</li>
<li>
<p><code class="inline-code">@@text</code>: This returns the value of all
text nodes that occur within the node (all descendant text nodes,
not just direct children), concatenated together into a single
string. If the node has no text node children, then the result is
an empty string.</p>
</li>
<li>
<p><code class="inline-code">@@start_tag</code>: Returns the markup of the
<a href="gloss.html#gloss.startTag">start-tag</a> of the element
node. As with <code class="inline-code">@@markup</code>, the output is not
necessary the same as in the original XML document, but it is
semantically equivalent with that. Regarding the XML name-spaces
(<code class="inline-code">xmlns:<em class="code-color">prefix</em></code>
attributes in the output, etc.) the rules are the same as with
<code class="inline-code">&quot;@@markup&quot;</code></p>
</li>
<li>
<p><code class="inline-code">@@end_tag</code>: Returns the markup of the
<a href="gloss.html#gloss.endTag">end-tag</a> of the element node.
As with <code class="inline-code">@@markup</code>, the output is not necessary
the same as in the original XML document, but it is semantically
equivalent with that.</p>
</li>
<li>
<p><code class="inline-code">@@attributes_markup</code>: Returns the markup
of the <a href="gloss.html#gloss.attribute">attributes</a> of the
element node. As with <code class="inline-code">@@markup</code>, the output is
not necessary the same as in the original XML document, but it is
semantically equivalent with that.</p>
</li>
<li>
<p><code class="inline-code">@@next_sibling_element</code> (since 2.3.26):
The following sibling element of an element node or an empty node
sequence if there&#39;s no such element. An element counts as a
sibling of another element if they are on the same hierarchical
level, and there&#39;s no other element or non-whitespace character
data (text or CDATA) between the two elements. For example in
<code class="inline-code">&lt;a/&gt;&lt;!-- comment
--&gt;&amp;#x20;&lt;b/&gt;</code> the two elements are
siblings, but not in <code class="inline-code">&lt;a/&gt;text&lt;b/&gt;</code>
or <code class="inline-code">&lt;a/&gt;&lt;x/&gt;&lt;b/&gt;</code>.</p>
</li>
<li>
<p><code class="inline-code">@@previous_sibling_element</code> (since
2.3.26): The previous sibling element of an element node or an
empty node sequence if there&#39;s no such element. See the last point
for the meaning of sibling.</p>
</li>
</ul>
<h2 class="content-header header-section2" id="autoid_146">Node sequences</h2>
<p>Many of the special hash keys (indicated in the above list),
and XPath expressions that result in node-sets (see the <a href="http://www.w3.org/TR/xpath">XPath recommendation</a>)
return a sequence of nodes.</p>
<p>These node sequences, if they store exactly 1 subvariable,
will also act as the subvariable itself. For example,
<code class="inline-code">${book.title[0]}</code> will do the same as
<code class="inline-code">${book.title}</code>, if there is only one
<code class="inline-code">title</code> element child of element
<code class="inline-code">book</code>.</p>
<p>Returning an empty node sequence is a normal situation. For
example, if in a concrete XML document, element
<code class="inline-code">book</code> has no child element
<code class="inline-code">chapter</code>, then <code class="inline-code">book.chapter</code>
results in an empty node sequence. Beware! This also means, that
<code class="inline-code">book.chaptre</code> (note the typo) will also return
empty node sequence, and will not stop with error. Also,
<code class="inline-code">book.chaptre??</code> (note the typo) will return
<code class="inline-code">true</code> because the empty sequence exists, so you
have to use <code class="inline-code">book.chaptre[0]??</code> for the
check.</p>
<p>Node sequences that store not 1 nodes (but 0 or more than 1
nodes) also support some of the hash keys described above. Namely,
the following special keys are supported:</p>
<ul>
<li>
<p><code class="inline-code"><em class="code-color">elementName</em></code>,
<code class="inline-code">&quot;<em class="code-color">prefix</em>:<em class="code-color">elementName</em>&quot;</code></p>
</li>
<li>
<p><code class="inline-code">@<em class="code-color">attrName</em></code>,
<code class="inline-code">&quot;@<em class="code-color">prefix</em>:<em class="code-color">attrName</em>&quot;</code></p>
</li>
<li>
<p><code class="inline-code">@@markup</code>,
<code class="inline-code">@@nested_markup</code></p>
</li>
<li>
<p><code class="inline-code">@@text</code></p>
</li>
<li>
<p><code class="inline-code">*</code>, <code class="inline-code">**</code></p>
</li>
<li>
<p><code class="inline-code">@@</code>, <code class="inline-code">&quot;@*&quot;</code></p>
</li>
</ul>
<p>When you apply one of the above special keys on a node
sequence that contains more than 1 or 0 nodes, then for each node in
the sequence (where the special key does make sense, e.g. text nodes
will be skipped for key <code class="inline-code">*</code> or
<code class="inline-code">@foo</code>), the special key will be applied as it was
explained for single nodes, and the results will be concatenated to
form the final result. The results will be concatenated in the order
as the corresponding nodes occur in the node sequence. The
concatenation means string or sequence concatenation depending on
the type of the results. If the special key would result in a string
for a single node, then for multiple nodes the result is a single
string too (the results for the single nodes concatenated), and if
the special key would return a sequence for a single node, then for
multiple nodes the result is a single sequence too. If there are 0
nodes in the sequence you apply the special key on, the string
result is an empty string or an empty sequence respectively.</p>
<p>XPath expressions can be used with node sequences. However,
for 0 or more than 1 nodes it will work only if you use Jaxen
instead of Xalan, because of the limitations of the Xalan XPath
implementation.</p>
<div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="xgui_imperative_learn.html"><span>Previous</span></a><a class="paging-arrow next" href="xgui_declarative.html"><span>Next</span></a></div></div></div></div> </div>
</div>
<div class="site-footer"><div class="site-width"><div class="footer-top"><div class="col-left sitemap"><div class="column"><h3 class="column-header">Overview</h3><ul><li><a href="https://freemarker.apache.org/">What is FreeMarker?</a></li><li><a href="https://freemarker.apache.org/freemarkerdownload.html">Download</a></li><li><a href="app_versions.html">Version history</a></li><li><a href="app_faq.html">FAQ</a></li><li><a itemprop="license" href="app_license.html">License</a></li><li><a href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy policy</a></li></ul></div><div class="column"><h3 class="column-header">Often used / Reference</h3><ul><li><a href="https://try.freemarker.apache.org/">Try template online</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions cheatsheet</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_builtins_alphaidx.html">?built_ins</a></li><li><a href="ref_specvar.html">.special_vars</a></li><li><a href="api/freemarker/core/Configurable.html#setSetting-java.lang.String-java.lang.String-">Configuration settings</a></li></ul></div><div class="column"><h3 class="column-header">Community</h3><ul><li><a href="https://github.com/apache/freemarker">Github project page</a></li><li><a href="https://issues.apache.org/jira/projects/FREEMARKER">Report a bug</a></li><li><a href="https://freemarker.apache.org/report-security-vulnerabilities.html">Report security vulnerability</a></li><li><a href="https://stackoverflow.com/questions/ask?tags=freemarker">Get help on StackOverflow</a></li><li><a href="https://twitter.com/freemarker">Announcements on Twitter</a></li><li><a href="https://freemarker.apache.org/mailing-lists.html">Discuss on mailing lists</a></li></ul></div></div><div class="col-right"><ul class="social-icons"><li><a class="github" href="https://github.com/apache/freemarker">Github</a></li><li><a class="twitter" href="https://twitter.com/freemarker">Twitter</a></li><li><a class="stack-overflow" href="https://stackoverflow.com/questions/ask?tags=freemarker">Stack Overflow</a></li></ul><a class="xxe" href="http://www.xmlmind.com/xmleditor/" rel="nofollow" title="Edited with XMLMind XML Editor"><span>Edited with XMLMind XML Editor</span></a></div></div><div class="footer-bottom"> <p class="last-generated">
Last generated:
<time itemprop="dateModified" datetime="2024-02-12T20:34:04Z" title="Monday, February 12, 2024 at 8:34:04 PM Greenwich Mean Time">2024-02-12 20:34:04 GMT</time>, for Freemarker 2.3.32 </p>
<p class="copyright">
© <span itemprop="copyrightYear">1999</span>–2024
<a itemtype="http://schema.org/Organization" itemprop="copyrightHolder" href="https://apache.org/">The Apache Software Foundation</a>. Apache FreeMarker, FreeMarker, Apache Incubator, Apache, the Apache FreeMarker logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners. </p>
</div></div></div></body>
</html>