arabica/include/XSLT/impl/xslt_qname.hpp

81 lines
1.9 KiB
C++
Raw Normal View History

2007-07-19 19:01:42 +02:00
#ifndef ARABICA_XSLT_QNAME_HPP
#define ARABICA_XSLT_QNAME_HPP
#include <XML/strings.hpp>
2007-07-19 19:01:42 +02:00
namespace Arabica
{
namespace XSLT
{
struct QName
{
std::string prefix;
std::string localName;
std::string namespaceURI;
std::string qname;
QName(const std::string& p,
const std::string& lN,
const std::string& uri) :
prefix(p),
localName(lN),
namespaceURI(uri),
qname(p.empty() ? lN : (p + ":" + lN))
{
} // QName
static QName create(const XML::QualifiedName<std::string>& qName)
{
if(qName.prefix().length() && qName.namespaceUri().empty())
throw SAX::SAXException("Prefix " + qName.prefix() + " is not declared.");
return QName(qName.prefix(), qName.localName(), qName.namespaceUri());
} // create
static QName create(const std::string& qName)
{
return create(qName, "");
} // create
2007-07-19 19:01:42 +02:00
static QName create(const std::string& qName, const std::string& namespaceURI)
2007-07-19 19:01:42 +02:00
{
2009-02-23 20:43:20 +01:00
if(!Arabica::XML::is_qname<Arabica::default_string_adaptor<std::string> >(qName))
throw SAX::SAXException("Bad name : " + qName);
2007-11-22 23:36:47 +01:00
static char COLON = Arabica::text::Unicode<char>::COLON;
std::string prefix;
std::string localName;
2007-07-19 19:01:42 +02:00
2007-11-22 23:36:47 +01:00
size_t colon = qName.find(COLON);
2007-11-22 23:36:47 +01:00
if(colon == std::string::npos)
localName = qName;
2007-07-19 19:01:42 +02:00
else
{
prefix = qName.substr(0, colon);
localName = qName.substr(colon+1);
2007-07-19 19:01:42 +02:00
}
return QName(prefix, localName, namespaceURI);
} // create
bool operator==(const QName& rhs) const
{
return (namespaceURI == rhs.namespaceURI) &&
(localName == rhs.localName);
} // operator==
bool operator<(const QName& rhs) const
{
if(namespaceURI == rhs.namespaceURI)
return localName < rhs.localName;
return namespaceURI < rhs.namespaceURI;
} // operator<
}; // struct QName
2007-07-19 19:01:42 +02:00
2007-07-19 19:01:42 +02:00
} // namespace XSLT
} // namespace Arabica
#endif