Versión de XSLT en iPhone

Planeo usar XML / XSLT en mi aplicación de iPhone.

¿Qué versión de XSLT actualmente es compatible con el iPhone? ¿Puedo usar XSLT 2.0 o solo 1.0?

Usar libxslt en el sistema operativo de iPhone es realmente bastante fácil:

  1. Descargue el código fuente de libxslt y extráigalo .
  2. Agregue el directorio “libxslt” a las rutas de búsqueda de encabezado en su configuración de comstackción. Además, agregue la ruta a libxml-headers allí (generalmente /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include/libxml2 ).
  3. Agregue libxml2.2.dylib y libxslt.dylib a los marcos vinculados (panel “Grupos y archivos” de Xcode: haga clic con el botón derecho en “Frameworks” -> “Agregar” -> “Frameworks existentes …”).
  4. Crea un archivo XML simple y su transformación XSL.

Y finalmente puede usar un código similar al ejemplo anterior para obtener el resultado de la transformación en un NSString (por ejemplo, para mostrarlo en un UIWebView ):

 #import  #import  #import  #import  #import  #import  #import  #import  #import  #import  ... 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(); 

Como señala Lou Franco, 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.

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 el soporte de xslt pero aún no lo tiene.

La única opción que conozco es utilizar directamente libxslt , que es compatible con xslt 1.0 y algunas de las extensiones exslt .

No puede usar libxslt en el iPhone incluso si lo comstack y lo comstack 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.

Para cualquiera que se actualice a XCode 5 + iOS7 baseSDK, notará que si incluyó libxslt-1.1.26 en su proyecto y compiló desde el origen, estaba usando la versión anterior de libxml . En la base más reciente, SDK libxml se ha actualizado y, como tal, deberá actualizar a libxslt-1.1.28 .

Cuando descargue el último archivo .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 todavía no existen. Ellos 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 diferencias

Simplemente cree una nueva copia de config.h.in llamada config.h .

Paso 2 – 12 diferencias

Simplemente cree una nueva copia de libxslt/xsltconfig.h.in llamada libxslt/xsltconfig.h .

Los primeros cuatro cambios son simplemente números de versión.

  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"

Los próximos cuatro

  1. #if @WITH_XSLT_DEBUG@ -> #if 1 // Simplemente reemplace @WITH_XSLT_DEBUG@ con 1
  2. #if @WITH_MEM_DEBUG@ -> #if 1
  3. #if @WITH_TRIO@ -> #if 0
  4. #if @WITH_DEBUGGER@ -> #if 1

Los últimos cuatro

  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

    Paso 3

Ahora que ha realizado manualmente los pasos que habría realizado ./configure , puede seguir las instrucciones descritas anteriormente para agregar los archivos libxslt a su proyecto:

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