Previous: , Up: Expansion Sequence   [Contents][Index]


A.1.1.3 Node Hoisting

Hoisting is the process of moving a fully expanded head node out of the expansion sequence; it is the final step of the process for a head node and is driven wholly by the eseq:is-expandable#1 predicate.

Unfortunately, we cannot continue processing immediately after hoisting for the same reasons that we cannot continue processing after expansion: after hoisting, the nodes may enter a proper context and acquire another meaning, which may result in, for example, additional symbols.

function: node()+ _eseq:hoist (eseq-node as element())

xmlns:_eseq="http://www.lovullo.com/tame/preproc/expand/eseq/_priv"

Hoisting removes the head node from the expansion sequence, leaving all other expansion nodes untouched. The result is a sequence of two nodes, the last of which is the expansion sequence element.

If no head node exists, the result is the single expansion sequence node unchanged.

Definition:

<function name="_eseq:hoist"  as="node()+">
  <param name="eseq-node"  as="element()" />

  <variable name="head"  as="node()?"  select="$eseq-node/node()[1]" />

  <sequence select="$head" />

  <!-- This @code{for-each} is purely to set the context for
       @code{copy}, since we do not know the sequence element
       name. -->
  <for-each select="$eseq-node">
    <copy>
      <sequence select="$eseq-node/@* , $head/following-sibling::node()" />
    </copy>
  </for-each>
</function>