Planeo usar XML/XSLT en mi aplicación de iPhone.Versión de XSLT en iPhone
¿Qué versión de XSLT es actualmente compatible con el iPhone? ¿Puedo usar XSLT 2.0 o solo 1.0?
Planeo usar XML/XSLT en mi aplicación de iPhone.Versión de XSLT en iPhone
¿Qué versión de XSLT es actualmente compatible con el iPhone? ¿Puedo usar XSLT 2.0 o solo 1.0?
Usando libxslt
en el iPhone OS es realmente muy fácil:
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include/libxml2
). PanelY, finalmente, se puede utilizar un código similar al ejemplo anterior para obtener como resultado la tranformación en una NSString
(por ejemplo, para mostrar en una 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();
Me temo que la situación xslt es bastante sombría. La clase NSXMLDocument
sería la forma de hacerlo, pero Apple lo sacó del iPhone.
TouchXML planifica la compatibilidad con xslt pero todavía no la tiene.
La única opción que conozco es utilizar directamente libxslt, que admite xslt 1.0 y algunas de las extensiones exslt.
Como Lou Franco señala, se No se permiten dylibs en el iPhone.
Funcionará bien en el desarrollo tanto en el simulador como en el teléfono, pero será rechazado tan pronto como lo envíe a Apple para su aprobación. Mi aplicación fue rechazada en aproximadamente 20 minutos, presumiblemente por su herramienta de análisis estático automático.
En su lugar, descargue la fuente, agréguela a su proyecto, vincule LibXML2.2.dylib (no me pregunte por qué se permite este dylib pero XSLT no lo está) y cree el proyecto. Eso es todo lo que tienes que hacer. Gracias a Lou por esto, ya que fue él quien me apuntó en la dirección correcta.
¿Está usando libxslt un dolor de cabeza? - Sí, hasta cierto punto, pero no es insuperable. Lo mejor que puede hacer es descargar el código fuente de LIBXSLT e incluir los aproximadamente 40 archivos (20 .my 20 .h) en una carpeta de su proyecto de Xcode. Una vez que haya agregado el marco libxml2.2.dylib (¡extrañamente este dylib es aceptable!), El código fuente de LIBXSLT se compilará como parte del proyecto principal y no tendrá problemas con respecto a su aplicación. rechazado por usar API no compatibles. –
No se puede compilar de esta manera. 'archivo 'config.h' no encontrado' – surfrider
No puede usar libxslt en el iPhone incluso si lo compila y lo compila usted mismo. Lo he hecho y mi aplicación ha sido rechazada repetidamente. Las herramientas utilizadas por el proceso de AppReview no distinguen entre símbolos vinculados estáticamente en su código y símbolos dinámicamente vinculados del iOS. En otras palabras, si parece que está utilizando libxslt, su aplicación será rechazada porque la tienda de aplicaciones no puede decir si está usando una API privada.
Usarlo desde la fuente es perfectamente aceptable ya que es su fuente. Lo que la tienda de aplicaciones automáticamente te rechazará es si todavía tienes una referencia a una biblioteca enlazada dinámicamente.Puede compilar libxslt como una biblioteca estática y vincularlo porque está presentando todo su archivo binario al mismo tiempo para su revisión. libxslt-1.1.26 tiene un problema de seguridad conocido ... posiblemente por qué Apple no quiere permitirle a sabiendas que use una biblioteca defectuosa que proporcionaron. Creo que está arreglado en libxslt-1.1.28 –
Para todos los que se actualicen a XCode 5 + iOS7 baseSDK, observará que si incluyó libxslt-1.1.26
en su proyecto y compiló desde la fuente, usaba la versión anterior de libxml
. En la última base, se ha actualizado el SDK libxml
y, como tal, deberá actualizarse al libxslt-1.1.28
.
Al descargar el archivo más reciente .tar.gz
todo lo que necesita incluir en su proyecto por primera vez son:
config.h
libxslt/*.h
libxslt/*.c
Pero config.h
y libxslt/xsltconfig.h
no existe por el momento Tienen el sufijo .in
. Tendrá que ejecutar el script ./configure
o si eso no funciona de inmediato, entonces haga trampa como yo.
Paso 1 - 0 a diferencias
Basta con crear una nueva copia de config.h.in
llamado config.h
.
Paso 2 - 12 diferencias
Basta con crear una nueva copia de libxslt/xsltconfig.h.in
llamado libxslt/xsltconfig.h
.
Los primeros cuatro cambios son simplemente números de versión.
#define LIBXSLT_DOTTED_VERSION "1.1.28"
#define LIBXSLT_VERSION 10128
#define LIBXSLT_VERSION_STRING "10128"
#define LIBXSLT_VERSION_EXTRA "-GITv1.1.28"
Los siguientes cuatro
#if @[email protected]
-> // Simplemente #if 1
@[email protected]
reemplazar con 1
#if @[email protected]
->#if 1
#if @[email protected]
->#if 0
#if @[email protected]
->#if 1
Los últimos cuatro
#if @[email protected]
->#if 1
#define LIBXSLT_DEFAULT_PLUGINS_PATH() "@[email protected]"
->#define LIBXSLT_DEFAULT_PLUGINS_PATH() "/usr/lib/libxslt-plugins"
#if @[email protected]
->#if 1
#if @[email protected]
->#if 0
Paso 3
Ahora que ha realizado de forma manual los pasos que ./configure
te hubiera realizado puede siga las instrucciones descritas anteriormente para agregar el libxslt
archivos a su proyecto:
config.h
libxslt/*.h
libxslt/*.c
dylibs no están permitidos en el iPhone. Necesita hacer una lib estática –
Apple rechazará esto, desafortunadamente. Ver los comentarios de Chris Gilbert, a continuación. Como no proporcionan los encabezados para este dylib, lo consideran un marco privado a pesar de ser una biblioteca pública. – Jason
Obteniendo un error EXC_BAD_ACCESS en "xsltSaveResultToString (& xmlResultBuffer, & length, res, sty);" ¿Algunas ideas? – docchang