请注意,由这些内建函数返回的变量是由用于结点变量的实现生成的。
意思就是返回的变量可以有更多的特性,附加于它这里的状态。
比如,由内建函数 children
返回的序列和 XML DOM 结点 也可以被用作是哈希表或字符串,
这在 XML 处理部分 中有描述。
ancestors
一个包含所有结点祖先结点的序列,以直接父结点开始,以根结点结束。
该内建函数的结果也是一个方法,你可以用它和元素的 完全限定名 来过滤结果。
比如以名称 section
用
node?ancestors("section")
来获得所有祖先结点的序列。
children
一个包含该结点所有子结点(也就是直接后继结点)的序列。
XML:这和特殊的哈希表的键 *
几乎是一样的。
除了它返回所有结点,而不但是元素。所以可能的子结点是元素结点,
文本结点,注释结点,处理指令结点等,但 不是
属性结点。属性结点排除在序列之外。
node_name
当被"访问"时,返回用来决定哪个自定义指令来调用控制这个结点的字符串。 可以参见 visit 和 recurse 指令。
XML:如果结点是元素或属性,那么字符串就会是元素或属性的本地
(没有前缀)名字。否则,名称通常在结点类型之后以 @
开始。
可以参见 该表格。
要注意这个结点名称与在DOM API中返回的结点名称不同;
FreeMarker 结点名称的目标是给要处理结点的用户自定义指令命名。
node_namespace
返回结点命名空间的字符串。FreeMarker 没有为结点命名空间定义准确的含义;
它依赖于变量是怎么建模的。也可能结点没有定义任何结点命名空间。
这种情形下,该函数应该返回未定义的变量
(也就是 node?node_namespace??
的值是 false
),所以不能使用这个返回值。
XML:这种情况下的XML,就是XML命名空间的URI
(比如 "http://www.w3.org/1999/xhtml"
)。
如果一个元素或属性结点没有使用XML命名空间,那么这个函数就返回一个空字符串。
对于其他XML结点这个函数返回未定义的变量。
node_type
描述结点类型的字符串。FreeMarker 没有对结点类型定义准确的含义;
它依赖于变量是怎么建模的。也可能结点并不支持结点类型。
在这种情形下,该函数就返回未定义值,所以就不能使用返回值。
(可以用 node?node_type??
继续检查一个结点是否是支持类型属性。)
XML:可能的值是: "attribute"
,
"text"
, "comment"
,
"document_fragment"
,
"document"
, "document_type"
,
"element"
, "entity"
,
"entity_reference"
,
"notation"
, "pi"
。
请注意,没有 "cdata"
类型,因为CDATA被认为是普通文本元素。
parent
在结点树中,返回该结点的直接父结点。根结点没有父结点,
所以对于根结点,表达式
node?parent??
的值就是 false
。
XML:注意通过这个函数返回的值也是一个序列
(当编写 someNode[".."]
时,和XPath表达式
..
的结果是一样的)。也要注意属性结点,
它返回属性所属的元素结点,尽管属性结点不被算作是元素的子结点。
root
该结点所属结点树的根结点。
XML:根据W3C,XML文档的根结点不是最顶层的元素结点,
而是文档本身,是最高元素的父结点。例如,
如果想得到被称为是 foo
的XML
(所谓的"文档元素",不要和"文档"搞混了)的最高 元素,
那么不得不编写 someNode?root.foo
。如果仅仅写了
someNode?root
,那么得到的是文档本身,而不是文档元素。