2009-01-20 8 views
14

Ich plane, XML/XSLT in meiner iPhone Anwendung zu verwenden.Version von XSLT in iPhone

Welche Version von XSLT wird derzeit auf dem iPhone unterstützt? Kann ich XSLT 2.0 oder nur 1.0 verwenden?

Antwort

15

Mit libxslt auf dem iPhone OS ist eigentlich ganz einfach:

  1. Download the source-code of libxslt und es extrahieren.
  2. Fügen Sie das Verzeichnis "libxslt" zu Header Suchpfade in Ihren Build-Einstellungen hinzu. Fügen Sie auch dort den Pfad zu den libxml-headern hinzu (normalerweise /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include/libxml2).
  3. hinzufügen libxml2.2.dylib und libxslt.dylib den verknüpften Frameworks (Xcode "Gruppen & Files" Panel: Rechtsklick auf "Frameworks" -> "Add" -> "Bestehende Karkassen ...").
  4. Erstellen Sie eine einfache XML-Datei und ihre XSL-Transformation.

Und schließlich können Sie einen Code ähnlich der Probe über die tranformation Ergebnis erhalten verwenden, um in eine NSString (zB in einem UIWebView anzuzeigen in):

#import <libxml/xmlmemory.h> 
#import <libxml/debugXML.h> 
#import <libxml/HTMLtree.h> 
#import <libxml/xmlIO.h> 
#import <libxml/xinclude.h> 
#import <libxml/catalog.h> 
#import <libxslt/xslt.h> 
#import <libxslt/xsltInternals.h> 
#import <libxslt/transform.h> 
#import <libxslt/xsltutils.h> 

... 

NSString* filePath = [[NSBundle mainBundle] pathForResource: @"article" ofType: @"xml"]; 
NSString* styleSheetPath = [[NSBundle mainBundle] pathForResource: @"article_transform" ofType:@"xml"]; 

xmlDocPtr doc, res; 

// tells the libxml2 parser to substitute entities as it parses your file 
xmlSubstituteEntitiesDefault(1); 
// This tells libxml to load external entity subsets 
xmlLoadExtDtdDefaultValue = 1; 

sty = xsltParseStylesheetFile((const xmlChar *)[styleSheetPath cStringUsingEncoding: NSUTF8StringEncoding]); 
doc = xmlParseFile([filePath cStringUsingEncoding: NSUTF8StringEncoding]); 
res = xsltApplyStylesheet(sty, doc, NULL); 

char* xmlResultBuffer = nil; 
int length = 0; 

xsltSaveResultToString(&xmlResultBuffer, &length, res, sty); 

NSString* result = [NSString stringWithCString: xmlResultBuffer encoding: NSUTF8StringEncoding]; 

NSLog(@"Result: %@", result); 

free(xmlResultBuffer); 

xsltFreeStylesheet(sty); 
xmlFreeDoc(res); 
xmlFreeDoc(doc); 

xsltCleanupGlobals(); 
xmlCleanupParser(); 
+2

dylibs sind nicht auf dem iPhone erlaubt. Sie müssen eine statische lib machen –

+1

Apple wird dies leider ablehnen. Siehe Kommentare von Chris Gilbert, unten. Da sie die Header für diese Dylib nicht bereitstellen, betrachten sie es als ein privates Framework, obwohl es eine öffentliche Bibliothek ist. – Jason

+0

Erhalte einen EXC_BAD_ACCESS-Fehler bei "xsltSaveResultToString (& xmlResultBuffer, & length, res, sty);" Irgendwelche Ideen? – docchang

5

Ich fürchte, die Xslt Situation ist ziemlich düster. Die NSXMLDocument Klasse wäre der Weg dies zu tun, aber Apple zog es vom iPhone.

TouchXML plant xslt Unterstützung aber hat es noch nicht.

Die einzige Option, die ich kenne, ist die direkte Verwendung von libxslt, die xslt 1.0 und einige der exslt Erweiterungen unterstützt.

7

Als Lou Franco darauf hinweist, Sie Es sind keine Dylibs auf dem iPhone erlaubt.

Es wird in der Entwicklung sowohl im Simulator als auch im Telefon funktionieren, aber es wird abgelehnt, sobald Sie es an Apple zur Genehmigung übermitteln. Meine App wurde innerhalb von etwa 20 Minuten abgelehnt, vermutlich durch das automatisierte statische Analysetool.

Laden Sie stattdessen die Quelle herunter, fügen Sie sie zu Ihrem Projekt hinzu, verknüpfen Sie die LibXML2.2.dylib (fragen Sie mich nicht, warum diese dylib erlaubt ist, aber die XSLT nicht!) Und erstellen Sie das Projekt. Das ist so ziemlich alles, was Sie tun müssen. Ich danke Lou dafür, dass er mich in die richtige Richtung wies.

+2

Verwendet libxslt Kopfschmerzen? - Ja bis zu einem gewissen Grad, aber es ist nicht unüberwindbar. Das Beste, was Sie tun können, ist den Quellcode für LIBXSLT herunterladen und die 40 oder so Dateien (20. M und 20. H-Dateien) in einem Ordner in Ihrem Xcode-Projekt enthalten. Sobald Sie das libxml2.2.dylib Framework hinzugefügt haben, wird der Quellcode von LIBXSLT als Teil des Hauptprojekts kompiliert und Sie haben keine Probleme in Bezug auf Ihre App für die Verwendung nicht unterstützter APIs abgelehnt –

+0

Kann nicht auf diese Weise kompiliert werden. '' config.h 'Datei nicht gefunden' – surfrider

2

Sie können libxslt nicht auf dem iPhone verwenden, selbst wenn Sie es kompilieren und selbst erstellen. Ich habe das gemacht und meine App wiederholt abgelehnt bekommen. Die von AppReview verwendeten Tools unterscheiden nicht zwischen statisch verknüpften Symbolen in Ihrem Code und dynamisch verknüpften Symbolen aus dem iOS. Mit anderen Worten, wenn es so aussieht, als ob Sie libxslt verwenden, wird Ihre App abgelehnt, da der Appstore nicht erkennen kann, ob Sie eine private API verwenden.

+0

Es von der Quelle zu verwenden ist vollkommen akzeptabel, da es Ihre Quelle ist. Der Appstore wird Sie automatisch abweisen, wenn Sie immer noch einen Verweis auf eine dynamisch verknüpfte Bibliothek haben.Sie können libxslt als statische Bibliothek erstellen und verknüpfen, da Sie alle Ihre Binärdateien gleichzeitig zur Überprüfung präsentieren. libxslt-1.1.26 hat ein bekanntes Sicherheitsproblem ... möglicherweise möchte Apple nicht wissentlich eine fehlerhafte Bibliothek verwenden, die sie zur Verfügung gestellt haben. Ich denke, es ist in libxslt-1.1.28 behoben –

2

Für alle, die auf XCode 5 + iOS7 BaseSDK aktualisieren, werden Sie bemerken, dass wenn Sie libxslt-1.1.26 in Ihr Projekt aufgenommen und von der Quelle kompiliert haben, es die vorherige Version von libxml verwendet. In der aktuellen Basis wurde das SDK libxml aktualisiert und als solches müssen Sie auf libxslt-1.1.28 aktualisieren.

Wenn Sie die neueste .tar.gz Datei herunterladen alles was Sie brauchen zum ersten Mal in einem Projekt gehören, sind:

  • config.h
  • libxslt/*.h
  • libxslt/*.c

Aber config.h und libxslt/xsltconfig.h existiere noch nicht. Sie haben das .in Suffix. Sie müssen entweder das Skript ./configure ausführen, oder wenn das nicht direkt aus der Box funktioniert, dann schummeln Sie wie ich.

Schritt 1 - 0. Unterschiede

einfach eine neue Kopie von config.h.inconfig.h Namen erstellen.

Schritt 2-12 Unterschiede

einfach eine neue Kopie von libxslt/xsltconfig.h.inlibxslt/xsltconfig.h Namen erstellen.

Die ersten vier Änderungen sind lediglich Versionsnummern.

  1. #define LIBXSLT_DOTTED_VERSION "1.1.28"
  2. #define LIBXSLT_VERSION 10128
  3. #define LIBXSLT_VERSION_STRING "10128"
  4. #define LIBXSLT_VERSION_EXTRA "-GITv1.1.28"

Die nächsten vier

  1. #if @[email protected] ->#if 1 // Simply ersetzen @[email protected] mit 1
  2. #if @[email protected] ->#if 1
  3. #if @[email protected] ->#if 0
  4. #if @[email protected] ->#if 1

Die letzten vier

  1. #if @[email protected] ->#if 1
  2. #define LIBXSLT_DEFAULT_PLUGINS_PATH() "@[email protected]" ->#define LIBXSLT_DEFAULT_PLUGINS_PATH() "/usr/lib/libxslt-plugins"
  3. #if @[email protected] ->#if 1
  4. #if @[email protected] ->#if 0

    Schritt 3

Nun, da Sie manuell die Schritte ausgeführt haben, dass ./configure würden Sie durchgeführt haben, können Befolgen Sie die Anweisungen, die zuvor für das Hinzufügen derbeschrieben wurden 0 Dateien zum Projekt:

  • config.h
  • libxslt/*.h
  • libxslt/*.c