Wersja XSLT w iPhone

Planuję używać XML/XSLT w mojej aplikacji na iPhone ' a.

Jaka wersja XSLT jest obecnie obsługiwana na iPhonie? Czy Mogę używać XSLT 2.0 lub tylko 1.0 ?

Author: tillda, 2009-01-20

5 answers

Używanie libxslt na iPhone OS jest w rzeczywistości dość proste:

  1. Pobierz kod źródłowy libxslt i rozpakuj go.
  2. Dodaj katalog "libxslt" do Header search paths w Ustawieniach kompilacji. Dodaj tam ścieżkę do nagłówków libxml (zwykle /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include/libxml2).
  3. Dodaj libxml2. 2.dylib i libxslt.dylib do linked Framework (Xcode "Groups & Files" panel: kliknij prawym przyciskiem myszy na "Framework" -- > " Add " -- > "Existing Ramy...").
  4. Utwórz prosty plik XML i jego transformację XSL.

I na koniec możesz użyć kodu podobnego do powyższej próbki, aby uzyskać wynik tranformacji na NSString (np. aby wyświetlić w UIWebView):

#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();
 15
Author: rpitting,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-16 14:49:44

Jak zaznacza Lou Franco, nie wolno Ci korzystać z iPhone ' a.

To będzie działać dobrze w rozwoju zarówno w symulatorze i telefon, ale to zostanie odrzucone, jak tylko przesłać go do Apple do zatwierdzenia. Moja aplikacja została odrzucona w ciągu około 20 minut, prawdopodobnie przez zautomatyzowane narzędzie do analizy statycznej.

Zamiast tego Pobierz źródło, dodaj je do swojego projektu, podlinkuj LibXML2. 2.dylib (nie pytaj mnie dlaczego ten dylib jest dozwolony, ale XSLT nie!) i zbudować projekt. To wszystko, co musisz zrobić. Uznanie Lou za to, że to on wskazał mi właściwy kierunek.

 7
Author: Chris Gilbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-08 11:57:07

Obawiam się, że sytuacja w xslt jest raczej ponura. Klasa NSXMLDocument byłaby sposobem na to, ale Apple wyciągnął ją z iPhone ' a.

TouchXML planuje obsługę xslt, ale jeszcze jej nie ma.

Jedyną opcją, jaką znam, jest bezpośrednie użycie libxslt , która obsługuje xslt 1.0 i niektóre rozszerzenia exslt .

 5
Author: Gordon Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-20 18:42:05

Nie możesz używać libxslt na iPhonie, nawet jeśli skompilujesz go i zbudujesz samodzielnie. Zrobiłem to i moja aplikacja była wielokrotnie odrzucana. Narzędzia używane przez proces AppReview nie rozróżniają statycznie połączonych symboli w kodzie i dynamicznie połączonych symboli z systemu iOS. Innymi słowy, jeśli wygląda na to, że używasz libxslt, Twoja aplikacja zostanie odrzucona, ponieważ appstore nie może stwierdzić, czy używasz prywatnego API.

 2
Author: Robert H. Bourdeau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-26 14:53:44

Dla wszystkich aktualizujących do Xcode 5 + iOS7 baseSDK, zauważysz, że jeśli włączyłeś libxslt-1.1.26 do swojego projektu i skompilowałeś go ze źródła, to korzystał on z wcześniejszej wersji libxml. W najnowszej bazie SDK libxml został zaktualizowany i jako taki trzeba będzie zaktualizować do libxslt-1.1.28.

Po pobraniu najnowszego pliku .tar.gz wszystko, co musisz dodać do swojego projektu po raz pierwszy, to:

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

Ale config.h i libxslt/xsltconfig.h jeszcze nie istnieją. Mają przyrostek .in. Musisz albo uruchomić skrypt ./configure, albo jeśli to nie działa od razu po wyjęciu z pudełka, to oszukuj tak, jak ja.

Krok 1-0 różnic

Po prostu utwórz nową kopię config.h.in o nazwie config.h.

Krok 2-12 różnic

Po prostu utwórz nową kopię libxslt/xsltconfig.h.in o nazwie libxslt/xsltconfig.h.

Pierwsze cztery zmiany to po prostu Wersja liczby.

  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"

Następne cztery

  1. #if @WITH_XSLT_DEBUG@ -> #if 1 //po prostu zamień @WITH_XSLT_DEBUG@ na 1
  2. #if @WITH_MEM_DEBUG@ -> #if 1
  3. #if @WITH_TRIO@ -> #if 0
  4. #if @WITH_DEBUGGER@ -> #if 1

Ostatnie cztery

  1. #if @WITH_MODULES@ -> #if 1
  2. #define LIBXSLT_DEFAULT_PLUGINS_PATH() "@LIBXSLT_DEFAULT_PLUGINS_PATH@" -> #define LIBXSLT_DEFAULT_PLUGINS_PATH() "/usr/lib/libxslt-plugins"
  3. #if @XSLT_LOCALE_XLOCALE@ -> #if 1
  4. #if @XSLT_LOCALE_WINAPI@ -> #if 0

    Krok 3

Teraz, gdy wykonałeś ręcznie kroki, które ./configure wykonałbyś, możesz postępować zgodnie z opisanymi wcześniej instrukcjami dodawania plików libxslt do swojego projektu:

  • config.h
  • libxslt/*.h
  • libxslt/*.c
 2
Author: Josh Peak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-23 01:54:59