Package freemarker.ext.jdom
Class NodeListModel
java.lang.Object
freemarker.ext.jdom.NodeListModel
- All Implemented Interfaces:
TemplateCollectionModel
,TemplateHashModel
,TemplateMethodModel
,TemplateModel
,TemplateScalarModel
,TemplateSequenceModel
@Deprecated
public class NodeListModel
extends Object
implements TemplateHashModel, TemplateMethodModel, TemplateCollectionModel, TemplateSequenceModel, TemplateScalarModel
Deprecated.
Provides a template for wrapping JDOM objects. It is capable of storing not only
a single JDOM node, but a list of JDOM nodes at once (hence the name).
Each node is an instance of any of the core JDOM node classes (except namespaces,
which are not supported at the moment), or String for representing text.
See individual method documentation for exact details on how the class works. In
short:
getAsString()
will render all contained nodes as XML fragment,exec(List)
provides full XPath functionality implemented on top of the Jaxen library,get(String)
provides node traversal, copying and filtering - somewhat less expressive than XPath, however it does not require the external library and it evaluates somewhat faster- being a
TemplateCollectionModel
allows to iterate the contained node list, and - being a
TemplateSequenceModel
allows to access the contained nodes by index and query the node count.
Note: There is a JDOM independent re-implementation of this class:
freemarker.ext.xml.NodeListModel
-
Field Summary
Fields inherited from interface freemarker.template.TemplateModel
NOTHING
Fields inherited from interface freemarker.template.TemplateScalarModel
EMPTY_STRING
-
Constructor Summary
ConstructorDescriptionNodeListModel(List nodes)
Deprecated.Creates a node list that holds a list of nodes.NodeListModel(List nodes, boolean copy)
Deprecated.Creates a node list that holds a list of nodes.NodeListModel(org.jdom.Document document)
Deprecated.Creates a node list that holds a singleDocument
node.NodeListModel(org.jdom.Element element)
Deprecated.Creates a node list that holds a singleElement
node. -
Method Summary
Modifier and TypeMethodDescriptionDeprecated.Applies an XPath expression to the node list and returns the resulting node list.get(int i)
Deprecated.Retrieves the i-th element of the node list.Deprecated.Provides node list traversal as well as special functions: filtering by name, filtering by node type, shallow-copying, and duplicate removal.Deprecated.This method returns the string resulting from concatenation of string representations of its nodes.boolean
isEmpty()
Deprecated.Returns true if this model contains no nodes.iterator()
Deprecated.Retrieves a template model iterator that is used to iterate over the elements in this collection.static void
Deprecated.Will be removed (main method in a library, often classified as CWE-489 "Leftover Debug Code").void
registerNamespace(String prefix, String uri)
Deprecated.Registers an XML namespace with this node list.int
size()
Deprecated.
-
Constructor Details
-
NodeListModel
public NodeListModel(org.jdom.Document document)Deprecated.Creates a node list that holds a singleDocument
node. -
NodeListModel
public NodeListModel(org.jdom.Element element)Deprecated.Creates a node list that holds a singleElement
node. -
NodeListModel
Deprecated.Creates a node list that holds a list of nodes.- Parameters:
nodes
- the list of nodes this template should hold. The created template will copy the passed nodes list, so changes to the passed list will not affect the model.
-
NodeListModel
Deprecated.Creates a node list that holds a list of nodes.- Parameters:
nodes
- the list of nodes this template should hold.copy
- if true, the created template will copy the passed nodes list, so changes to the passed list will not affect the model. If false, the model will reference the passed list and will sense changes in it, although no operations on the list will be synchronized.
-
-
Method Details
-
isEmpty
public boolean isEmpty()Deprecated.Returns true if this model contains no nodes.- Specified by:
isEmpty
in interfaceTemplateHashModel
-
getAsString
Deprecated.This method returns the string resulting from concatenation of string representations of its nodes. Each node is rendered using its XML serialization format, while text (String) is rendered as itself. This greatly simplifies creating XML-transformation templates, as to output a node contained in variable x as XML fragment, you simply write ${x} in the template.- Specified by:
getAsString
in interfaceTemplateScalarModel
- Throws:
TemplateModelException
-
get
Deprecated.Provides node list traversal as well as special functions: filtering by name, filtering by node type, shallow-copying, and duplicate removal. While not as powerful as the full XPath support built into theexec(List)
method, it does not require the external Jaxen library to be present at run time. Below are listed the recognized keys. In key descriptions, "applicable to this-and-that node type" means that if a key is applied to a node list that contains a node of non-applicable type a TemplateMethodModel will be thrown. However, you can use_ftype
key to explicitly filter out undesired node types prior to applying the restricted-applicability key. Also "current nodes" means nodes contained in this set.*
or_children
: all direct element children of current nodes (non-recursive). Applicable to element and document nodes.@*
or_attributes
: all attributes of current nodes. Applicable to elements only._content
the complete content of current nodes (non-recursive). Applicable to elements and documents._text
: the text of current nodes, one string per node (non-recursive). Applicable to elements, attributes, comments, processing instructions (returns its data) and CDATA sections. The reserved XML characters ('<' and '&') are escaped._plaintext
: same as_text
, but does not escape any characters, and instead of returning a NodeList returns a SimpleScalar._name
: the names of current nodes, one string per node (non-recursive). Applicable to elements and attributes (returns their local name), entities, processing instructions (returns its target), doctypes (returns its public ID)_qname
: the qualified names of current nodes in[namespacePrefix:]localName
form, one string per node (non-recursive). Applicable to elements and attributes_cname
: the canonical names of current nodes (namespace URI + local name), one string per node (non-recursive). Applicable to elements and attributes_nsprefix
: namespace prefixes of current nodes, one string per node (non-recursive). Applicable to elements and attributes_nsuri
: namespace URIs of current nodes, one string per node (non-recursive). Applicable to elements and attributes_parent
: parent elements of current nodes. Applicable to element, attribute, comment, entity, processing instruction._ancestor
: all ancestors up to root element (recursive) of current nodes. Applicable to same node types as_parent
._ancestorOrSelf
: all ancestors of current nodes plus current nodes. Applicable to same node types as_parent
._descendant
: all recursive descendant element children of current nodes. Applicable to document and element nodes._descendantOrSelf
: all recursive descendant element children of current nodes plus current nodes. Applicable to document and element nodes._document
: all documents the current nodes belong to. Applicable to all nodes except text._doctype
: doctypes of the current nodes. Applicable to document nodes only._fname
: is a filter-by-name template method model. When called, it will yield a node list that contains only those current nodes whose name matches one of names passed as argument. Attribute names should NOT be prefixed with the at sign (@). Applicable on all node types, however has no effect on unnamed nodes._ftype
: is a filter-by-type template method model. When called, it will yield a node list that contains only those current nodes whose type matches one of types passed as argument. You should pass a single string to this method containing the characters of all types to keep. Valid characters are: e (Element), a (Attribute), n (Entity), d (Document), t (DocType), c (Comment), p (ProcessingInstruction), x (text). If the string anywhere contains the exclamation mark (!), the filter's effect is inverted._type
: Returns a one-character String SimpleScalar containing the typecode of the first node in the node list. Valid characters are: e (Element), a (Attribute), n (Entity), d (Document), t (DocType), c (Comment), p (ProcessingInstruction), x (text). If the type of the node is unknown, returns '?'. If the node list is empty, returns an empty string scalar._unique
: a copy of the current nodes that keeps only the first occurrence of every node, eliminating duplicates. Duplicates can occur in the node list by applying uptree-traversals_parent
,_ancestor
,_ancestorOrSelf
, and_document
. I.e.foo._children._parent
will return a node list that has duplicates of nodes in foo - each node will have the number of occurrences equal to the number of its children. In these cases, usefoo._children._parent._unique
to eliminate duplicates. Applicable to all node types._copy
: a copy of the current node list. It is a shallow copy that shares the underlying node list with this node list, however it has a separate namespace registry, so it can be used to guarantee that subsequent changes to the set of registered namespaces does not affect the node lists that were used to create this node list. Applicable to all node types._registerNamespace(prefix, uri)
: register a XML namespace with the specified prefix and URI for the current node list and all node lists that are derived from the current node list. After registering, you can use thenodelist["prefix:localname"]
ornodelist["@prefix:localname"]
syntaxes to reach elements and attributes whose names are namespace-scoped. Note that the namespace prefix need not match the actual prefix used by the XML document itself since namespaces are compared solely by their URI. You can also register namespaces from Java code using theregisterNamespace(String, String)
method.@attributeName
: named attributes of current nodes. Applicable to elements, doctypes and processing instructions. On doctypes it supports attributespublicId
,systemId
andelementName
. On processing instructions, it supports attributestarget
anddata
, as well as any other attribute name specified in data asname="value"
pair. The attribute nodes for doctype and processing instruction are synthetic, and as such have no parent. Note, however that@*
does NOT operate on doctypes or processing instructions.- any other key: element children of current nodes with name matching the key.
This allows for convenience child traversal in
book.chapter.title
style syntax. Note thatnodeset.childname
is technically equivalent tonodeset._children._fname("childname")
, but is both shorter to write and evaluates faster. Applicable to document and element nodes.
- Specified by:
get
in interfaceTemplateHashModel
- Parameters:
key
- a key that identifies a required set of nodes- Returns:
- a new NodeListModel that represents the requested set of nodes.
- Throws:
TemplateModelException
-
iterator
Deprecated.Description copied from interface:TemplateCollectionModel
Retrieves a template model iterator that is used to iterate over the elements in this collection.- Specified by:
iterator
in interfaceTemplateCollectionModel
-
get
Deprecated.Retrieves the i-th element of the node list.- Specified by:
get
in interfaceTemplateSequenceModel
- Returns:
- the item at the specified index, or
null
if the index is out of bounds. Note that anull
value is interpreted by FreeMarker as "variable does not exist", and accessing a missing variables is usually considered as an error in the FreeMarker Template Language, so the usage of a bad index will not remain hidden, unless the default value for that case was also specified in the template. - Throws:
TemplateModelException
-
size
public int size()Deprecated.- Specified by:
size
in interfaceTemplateSequenceModel
- Returns:
- the number of items in the list.
-
exec
Deprecated.Applies an XPath expression to the node list and returns the resulting node list. In order for this method to work, your application must have access Jaxen library classes. The implementation does cache the parsed format of XPath expressions in a weak hash map, keyed by the string representation of the XPath expression. As the string object passed as the argument is usually kept in the parsed FreeMarker template, this ensures that each XPath expression is parsed only once during the lifetime of the FreeMarker template that contains it.- Specified by:
exec
in interfaceTemplateMethodModel
- Parameters:
arguments
- the list of arguments. Must contain exactly one string that is the XPath expression you wish to apply. The XPath expression can use any namespace prefixes that were defined using theregisterNamespace(String, String)
method or thenodelist._registerNamespace(prefix, uri)
expression in the template.- Returns:
- a NodeListModel representing the nodes that are the result of application of the XPath to the current node list.
- Throws:
TemplateModelException
-
registerNamespace
Deprecated.Registers an XML namespace with this node list. Once registered, you can refer to the registered namespace using its prefix in theget(String)
method from this node list and all other node lists that are derived from this node list. Use thenodelist["prefix:localname"]
or thenodelist["@prefix:localname"]
syntax to reach elements and attributes whose names are namespace-scoped. Note that the namespace prefix need not match the actual prefix used by the XML document itself since namespaces are compared solely by their URI. You can also register namespaces during template evaluation using thenodelist._registerNamespace(prefix, uri)
syntax in the template. This mechanism is completely independent from the namespace declarations in the XML document itself; its purpose is to give you an easy way to refer to namespace-scoped elements inget(String)
and in XPath expressions passed toexec(List)
. Note also that the namespace prefix registry is shared among all node lists that are created from a single node list - modifying the registry in one affects all others as well. If you want to obtain a namespace "detached" copy of the node list, use the_copy
key on it (or callnodeList.get("_copy")
directly from your Java code. The returned node list has all the namespaces that the original node list has, but they can be manipulated independently thereon. -
main
Deprecated.Will be removed (main method in a library, often classified as CWE-489 "Leftover Debug Code").Loads a template from a file passed as the first argument, loads an XML document from the standard input, passes it to the template as variabledocument
and writes the result of template processing to standard output.- Throws:
Exception
-
NodeModel
instead.