#include #include #include #include #include "xmlassociatexsl.h" XmlAssociateXsl::XmlAssociateXsl(const std::string& path, size_t size) : d(new XslData()) { d->buffer.reserve(size); d->path = path; d->rootElementSeen = false; XML_SetUserData(p, d.get()); XML_SetElementHandler(p, start, end); XML_SetProcessingInstructionHandler(p, processinghandler); XML_SetDefaultHandlerExpand(p, defaulthandler); } XmlAssociateXsl::~XmlAssociateXsl() { } void XMLCALL XmlAssociateXsl::defaulthandler( void *data, const XML_Char *s, int len) { XslData *d; d = (XslData *)data; d->buffer.append(s, len); } void XMLCALL XmlAssociateXsl::start(void *data, const XML_Char *el, const XML_Char **attr) { XslData *d; d = (XslData *)data; if (!d->rootElementSeen) { d->buffer += "buffer += d->path; d->buffer += "\"?>\n"; d->rootElementSeen = true; } d->buffer += "<"; d->buffer += el; while (*attr) { d->buffer += " "; d->buffer += *attr; d->buffer += "=\""; d->buffer += xmliseAttribute(*(attr + 1)); d->buffer += "\""; attr += 2; } d->buffer += ">"; } void XMLCALL XmlAssociateXsl::end(void *data, const XML_Char *el) { XslData *d; d = (XslData *)data; d->buffer += "buffer += el; d->buffer += ">"; } void XMLCALL XmlAssociateXsl::processinghandler( void *data, const XML_Char *target, const XML_Char *datastring) { XslData *d; d = (XslData *)data; if (!strcmp(target, "xml-stylesheet")) return; d->buffer += "buffer += target; d->buffer += " "; d->buffer += datastring; d->buffer += "?>"; }