#ifndef ARABICA_XSLT_KEY_HANDLER_HPP #define ARABICA_XSLT_KEY_HANDLER_HPP #include "../xslt_key.hpp" #include namespace Arabica { namespace XSLT { template class KeyHandler : public SAX::DefaultHandler { typedef StylesheetConstant SC; typedef AttributeValidators AV; typedef typename Key::MatchExprList MatchExprList; public: KeyHandler(CompilationContext& context) : context_(context), key_(0) { } // KeyHandler virtual void startElement(const string_type& /* namespaceURI */, const string_type& /* localName */, const string_type& qName, const SAX::Attributes& atts) { if(key_ != 0) throw SAX::SAXException(string_adaptor::asStdString(qName) + " can not contain elements"); static const AV rules = AV::rule(SC::name, true) .rule(SC::match, true) .rule(SC::use, true); std::map attrs = rules.gather(qName, atts); name_ = context_.processInternalQName(attrs[SC::name]).clarkName(); try { MatchExprList matches = context_.xpath_match_no_variables(attrs[SC::match]); Arabica::XPath::XPathExpression use = context_.xpath_expression_no_variables(attrs[SC::use]); key_ = new Key(matches, use); } // try catch(const Arabica::XPath::UnboundVariableException&) { throw SAX::SAXException("Variable references are not allowed in xsl:key match and use expressions"); } // catch } // startElement virtual void endElement(const string_type& /* namespaceURI */, const string_type& /* localName */, const string_type& /* qName */) { context_.stylesheet().add_key(name_, key_); context_.pop(); } // endElement virtual void characters(const string_type& ch) { verifyNoCharacterData(ch, SC::key); } // characters private: CompilationContext& context_; string_type name_; Key* key_; }; // class KeyHandler } // namespace XSLT } // namespace Arabica #endif