Bitte um Hilfe fuer ein XSLT QTplug-in (xsltproc c++ )

Alles rund um die Programmierung mit Qt
Antworten
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Bitte um Hilfe fuer ein XSLT QTplug-in (xsltproc c++ )

Beitrag von patrik08 »

Seit 5 stunden :-( versuche ich die libxml2 & xslt ins leben zu bringen...
um xml zu parsen http://ciz.ch/svnciz/xslt_c++_sample/main.cpp
der compiler geht prima durch ... aber die exe sagt das eine funktion fehlt... obwohl noch einmal alle dll im ordner sind...

(leider kenne ich kein bessere weg um saubere pdf mit qt zu erstellen)

source via svn holen.... oder ansehen.....
http://ciz.ch/svnciz/xslt_c++_sample/

Was mache ich falsch mit dieser libs.... ??

Das einzige QT Projekt was ich gesehen habe mit xslt ist ....
http://albumshaper.sourceforge.net/ super ding ... sogar im qt4...

Die QtXml zu file schreiben ist ja gut .... (auch wenn man in einem stream viel schneller ist....)


mit stream....

Code: Alles auswählen


    QTextStream stream;
    stream.setDevice( &file );
    stream.setEncoding( QTextStream::UnicodeUTF8 );
    stream << "<?xml version=\"1.0\"?>\n";
    stream << "<album version=\"1.1\">\n";
    stream << "  <name>" << fixXMLString(name) << "</name>\n";
    stream << "  <description>" << fixXMLString(description) << "</description>\n";
    stream << "  <author>" << fixXMLString(author) << "</author>\n";
    stream << "  <created>" << creationYear << " " << creationMonth << " " << creationDay << "</created>\n";
    stream << "  <modified>" << modificationYear << " " << modificationMonth << " " << modificationDay << "</modified>\n";
    stream << "  <theme>" << theme << "</theme>\n";
    stream << "  <thumbnailDimensions>" << THUMBNAIL_WIDTH << " " << THUMBNAIL_HEIGHT << "</thumbnailDimensions>\n";
    stream << "  <slideshowDimensions>" << SLIDESHOW_WIDTH << " " << SLIDESHOW_HEIGHT << "</slideshowDimensions>\n";



das selbe mit QDomDocument

Code: Alles auswählen


    QDomDocument doc("xmlconfig");
    QDomElement root = doc.createElement("root"); 
    doc.appendChild(root);
    
    QDomElement stamp = doc.createElement("lastmodiefield");
    root.appendChild(stamp );
    QDomText stampvalue = doc.createTextNode( QString( "%1" ).arg(unixtime() ) );
    stamp.appendChild(stampvalue);
///// unsw jede zeile vom xml 3 x mehr.....


Gut ist wie im neuen php5 ....
doc.createElement("tagname","Inhalt");
doc.setattribut("attname","value"); ecc...

Einmal habe ich gelesen ..... Jede Gute Software benutzt XML... aber das konvertieren

Mit php5 + GTK ist der ganze spass nur etwas 200 zeile...
mit 3 tab widgets + text area zum editieren (xml,xslt,result) font farbe speichern ecc.. ohne printer ... sonst alles dabei.. wie? http://ciz.ch/svnciz/new_php_gtk2/xmleditor_final/
file XML_Editor_XSLT_Converter.php
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

QT4 mit + XSLT ( Benchmark Results )

Beitrag von patrik08 »

edlich eine loesung in sicht....
das zauberwort ist tata!

Sablotron

der auch spitze im XSLT Benchmark Results
http://www.xml.com/pub/a/2001/03/28/xsl ... sults.html
last sich benutzer-freundlich kompilieren.. nicht wie xmllib2
http://devpaks.org/details.php?devpak=132
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Endlich ist es soweit....

Die _Debug.h ist eine datei ... (in der hoffnung wen eventuel eine neue qt version da ist ... dass ich nicht zu viel am haupt code aendern muss...
das heist basis funktionen ... oder tools...) bei intersessen sicher noch 6 monaten Iher ... http://ciz.ch/svnciz/xslt_sablotron_c++/class/

Aber wie ich sehe ist XML oder XSLT ein umbekanntes land bei qt user...
in diesen therd fuhre ich selbst gespraechen :-(


header xslt_mini_wrapper.h

Code: Alles auswählen


#ifndef XSLT_MINI_WRAPPER_H
#define XSLT_MINI_WRAPPER_H

#include <string>
#include <iostream>
#include <vector>

#include "../_Debug.h"

/*
usage:
    Xslt_Proc xslt(appdir+"output.html");  //// output result 
    xslt.Fops(appdir+"foo.xml",appdir+"foo.xsl");  //// waht convert?
    if (xslt.errormsg != "ok_ready") {
    QMessageBox::warning( 0, "Xslt error", QString( "Xslt say error : %1" ).arg( xslt.errormsg ) );   
    } 
*/


/* dest to qt4  */
class Xslt_Proc
{
   public:
		Xslt_Proc( QString filedest );
		~Xslt_Proc();
        bool SetParams( QString x );
        bool Fops( QString filexml , QString filexslt );
        bool Fop_java( QString fofile , QString pdffile );
        QString GetError();
        QString GetPuffer();
        QString puffer;
        QString errormsg;
        QString log_file;
        bool Log_Action( QString line );
        bool Log_Reset();
        bool method_puffer;  /* false is only file */
   private:
        bool RelaxNG( QString item );
        bool CheckFile();
        QString cacher;
        QFile  _result_file_;
        QTextStream autor;
    
};



#endif

header xslt_mini_wrapper.cpp

Code: Alles auswählen

#include "xslt_mini_wrapper.h"
/*
#define ATCHAR __FILE__":"TOSTRING(__LINE__)" "
#define AT chars2qt(ATCHAR)
declared on debug file....
*/

Xslt_Proc::Xslt_Proc( QString filedest )
{
    cacher = filedest;
    QFile _result_file_( filedest );
    if ( _result_file_.open( QFile::WriteOnly | QFile::Text ) ) {
    /* dear file stay open .... reserve mem to file.... */
    QTextStream autor( &_result_file_ );
    autor << "<!-- start  " << double2char(getExactTime()) << " -->\n" ;
    } else {
    errormsg = "not possibel to write file... ";  
    }
    log_file = QCoreApplication::applicationDirPath()+"/xslt_log.dat";
    #if defined( Q_WS_X11 )
    log_file = QDir::homePath()+"/.xslt_log.dat";
    #endif
    #if defined( Q_WS_MACX )
    log_file = QDir::homePath()+"/.devel/"+ UNIXTIME +"_xslt_log.dat";
    #endif
    #if defined(Q_WS_WIN)
    log_file = QCoreApplication::applicationDirPath()+"/xslt_log.dat";
    #endif
    /* file_put_contents( _result_file_ ,QString( "Wait action .... %1  %2 \n" ).arg( int2char(  unixtime() ) , double2char(getExactTime()) )  */
   Log_Reset();
   Log_Action( AT+" Start and out to file "+filedest );
   puffer =  "";
   errormsg = "ok";
   method_puffer = false;
}

/*  */
Xslt_Proc::~Xslt_Proc()
{
   CheckFile();
   file_put_contents(cacher,GetPuffer()); 
}

/*  */
bool Xslt_Proc::SetParams( QString x )
{
    return true;
}

QString Xslt_Proc::GetError()
{
    return errormsg;
}

QString Xslt_Proc::GetPuffer()
{
    method_puffer = true;
    return puffer;
}

bool Xslt_Proc::CheckFile()
{
 if ( _result_file_.open( QFile::WriteOnly | QFile::Text ) ) {
     _result_file_.flush();
    _result_file_.close();
   return true;     
  }
return false;
}

bool Xslt_Proc::RelaxNG( QString item )
{
    QString lines = file_get_line(item,1)+file_get_line(item,2);
    if (lines.contains("iso-8859-1", Qt::CaseInsensitive) or 
        lines.contains("utf-8", Qt::CaseInsensitive) or
        lines.contains("version", Qt::CaseInsensitive)
    )   
    {
    return true;
    } else {
    errormsg = "Set Appropriate encoding on file... UTF-8 or ISO-8859-1 check xml xsl"; 
    return false;        
    }
}



/*  */
bool Xslt_Proc::Fops( QString filexml , QString filexslt )
{
   char *resultArg = NULL;    /*  arrayParams to xslt file  */
   int ecode;
   register char *sheetBuf, *inputBuf;
   /*  __cpu_register__  to find and count on grep */
    if ( !RelaxNG(filexml)  and  !RelaxNG(filexml) ) {
    CheckFile();
    return false;
    }
   sheetBuf = file_get_contents_char(qtchars(filexslt));  /* xslt file  */
   inputBuf = file_get_contents_char(qtchars(filexml));   /* xml file and ensure is set better as utf8 toAscii */ 
   ecode = SablotProcessStrings(sheetBuf, inputBuf, &resultArg );
   puffer = QString( "%1" ).arg( resultArg );
   CheckFile();  /* ok take file .. only here write...  */
    if (!file_put_contents(cacher,GetPuffer())) {
    errormsg = "not possibel to write file... ";
    return false;       
    }        
                    Log_Action( AT+" Files ...  \n"+QString( "xslt = %1 and xml = %2" ).arg( filexslt , filexml  ) ); 
                    Log_Action( AT+" Incomming sheetBuf...  \n"+QString( "%1" ).arg( sheetBuf ) ); 
                    Log_Action( AT+" Incomming inputBuf...  \n"+QString( "%1" ).arg( inputBuf ) ); 
                    Log_Action( AT+" Wait...  "+puffer );
    
    SablotFree(resultArg);
    resultArg = NULL;
    
    
     if (puffer.size() > 0)
        {
        errormsg = "ok_ready";
        CheckFile();
        return true;
        } else {
         puffer = "";
         errormsg = QString( "error on file .... have a look on doc header sablot.h declare ecc.. \nXslt say: %1" ).arg( int2char(ecode) );            
         Log_Action( AT+QString( " Fatal Error Learn write xslt file!  ... %1" ).arg( errormsg ) );
         CheckFile();
        return false;
        } 
}
/* external java fop setup & convert */
bool Xslt_Proc::Fop_java( QString fofile , QString pdffile )
{
     const QString javadir = getenv("JAVA_HOME");
     if (javadir.size() > 1) {
     Log_Action( AT+QString( " last errormsg %1" ).arg( errormsg ) );
     errormsg = QString( " java_dir_found on dir = %1" ).arg( javadir );
     Log_Action( AT+QString( " new errormsg java starts %1" ).arg( errormsg ) );
     return true;
     } else {
     /* start java bin installer */
     errormsg = "Java ist not installed....";
     return false;
     }
    
}


bool Xslt_Proc::Log_Action( QString line )
{
#ifndef _BIRTHRELEASE_NO
file_put_contents_append(log_file, qt_unixtime( line ) );
return true;
#else
return true
#endif
}

bool Xslt_Proc::Log_Reset()
{
#ifndef _BIRTHRELEASE_NO
file_put_contents(log_file,"");
Log_Action( "Start a new log from reset" );
return true;
#else
return true
#endif
}


/*  ######################################################################################### */ 




patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Endlich geht doch noch xslt xml mit qt4

Beitrag von patrik08 »

es ist zwar kein plug-in .. ( die LIBS += ./lib/libexslt.a LIBS += ./lib/libxml2.a
LIBS += ./lib/libxslt.a ) machen ja bereit alles ....

eine beta version ist Iher : http://ppk.ciz.ch/win_build/vxsltproc_win32.tar.bz2

man kann sogar remote xsl xml file holen aber .... convertieren kann man vorest nur local file...
Antworten