virtual void execute(const DOM::Node<string_type, string_adaptor>& node, ExecutionContext<string_type, string_adaptor>& context) const { ParamPasser<string_type, string_adaptor> passer(*this, node, context); if(!SortableT::has_sort() && select_ == 0) { if(node.hasChildNodes()) context.stylesheet().applyTemplates(node.getChildNodes(), context, mode_); return; } Arabica::XPath::NodeSet<string_type, string_adaptor> nodes; if(select_ == 0) for(DOM::Node<string_type, string_adaptor> n = node.getFirstChild(); n != 0; n = n.getNextSibling()) nodes.push_back(n); else { Arabica::XPath::XPathValue<string_type, string_adaptor> value = select_->evaluate(node, context.xpathContext()); if(value.type() != Arabica::XPath::NODE_SET) throw std::runtime_error("apply-templates select expression is not a node-set"); nodes = value.asNodeSet(); } this->sort(node, nodes, context); context.stylesheet().applyTemplates(nodes, context, mode_); } // execute
virtual void process_content(const DOM::Node<std::string>& node, ExecutionContext& context) const { if(node.hasAttributes()) { const DOM::NamedNodeMap<std::string>& attrs = node.getAttributes(); for(unsigned int a = 0; a < attrs.getLength(); ++a) copy(attrs.item(a), context); } // if ... for(DOM::Node<std::string> n = node.getFirstChild(); n != 0; n = n.getNextSibling()) copy(n, context); } // process_content