#ifndef ARABICA_XPATHIC_XPATH_NODE_TEST_HPP #define ARABICA_XPATHIC_XPATH_NODE_TEST_HPP #include #include "xpath_namespace_node.hpp" #include namespace Arabica { namespace XPath { namespace impl { template class NodeTest { protected: NodeTest() { } public: virtual ~NodeTest() { } virtual bool operator()(const DOM::Node& node) const = 0; private: NodeTest(NodeTest&); bool operator==(const NodeTest&); NodeTest& operator=(const NodeTest&); }; // class NodeTest template class AnyNodeTest : public NodeTest { public: virtual bool operator()(const DOM::Node& node) const { return true; } // matches }; // class AnyNodeTest template class NameNodeTest : public NodeTest { public: NameNodeTest(const string_type& name) : name_(name) { } virtual bool operator()(const DOM::Node& node) const { return (name_ == node.getNodeName()) && (string_adaptor::empty(node.getPrefix())); } // test private: string_type name_; }; // NameNodeTest template class QNameNodeTest : public NodeTest { public: QNameNodeTest(const string_type& namespace_uri, const string_type& name) : uri_(namespace_uri), name_(name) { } virtual bool operator()(const DOM::Node& node) const { return (name_ == node.getLocalName()) && (uri_ == node.getNamespaceURI()); } // test private: string_type uri_; string_type name_; }; // QNameNodeTest template class StarNodeTest : public NodeTest { public: virtual bool operator()(const DOM::Node& node) const { // match the primary node types on the various axis // fortunately they are all independent int type = node.getNodeType(); return (type == DOM::Node_base::ELEMENT_NODE || type == NAMESPACE_NODE_TYPE || type == DOM::Node_base::ATTRIBUTE_NODE); } // test }; // class StarNodeTest template class QStarNodeTest : public NodeTest { public: QStarNodeTest(const string_type& namespace_uri) : uri_(namespace_uri) { } virtual bool operator()(const DOM::Node& node) const { return (uri_ == node.getNamespaceURI()); } // test private: string_type uri_; }; // clase QStarNodeTest template class TextNodeTest : public NodeTest { public: virtual bool operator()(const DOM::Node& node) const { return node.getNodeType() == DOM::Node::TEXT_NODE; } // test }; // class TextNodeTest template class CommentNodeTest : public NodeTest { public: virtual bool operator()(const DOM::Node& node) const { return node.getNodeType() == DOM::Node::COMMENT_NODE; } // operator() }; // CommentNodeTest template class AttributeNodeTest : public NodeTest { public: virtual bool operator()(const DOM::Node& node) const { return node.getNodeType() == DOM::Node::ATTRIBUTE_NODE; } // operator() }; // AttributeNodeTest template class NotAttributeNodeTest : public NodeTest { public: virtual bool operator()(const DOM::Node& node) const { return node.getNodeType() != DOM::Node::ATTRIBUTE_NODE; } // operator() }; // NotAttributeNodeTest template class ProcessingInstructionNodeTest : public NodeTest { public: ProcessingInstructionNodeTest() : target_() { } ProcessingInstructionNodeTest(const string_type& target) : target_(target) { } virtual bool operator()(const DOM::Node& node) const { if(node.getNodeType() != DOM::Node::PROCESSING_INSTRUCTION_NODE) return false; if(string_adaptor::empty(target_)) return true; return node.getNodeName() == target_; } // test private: string_type target_; }; // ProcessingInstructionNodeTest template class RootNodeTest : public NodeTest { public: virtual bool operator()(const DOM::Node& node) const { int type = node.getNodeType(); return (type == DOM::Node::DOCUMENT_NODE) || (type == DOM::Node::DOCUMENT_FRAGMENT_NODE); } // operator() }; // RootNodeTest } // namespace impl } // namespace XPath } // namespace Arabica #endif