Версия XSLT в iPhone - PullRequest
       56

Версия XSLT в iPhone

14 голосов
/ 20 января 2009

Я планирую использовать XML / XSLT в своем приложении для iPhone.

Какая версия XSLT в настоящее время поддерживается на iPhone? Могу ли я использовать XSLT 2.0 или просто 1.0?

Ответы [ 5 ]

15 голосов
/ 16 февраля 2010

Использование libxslt на iPhone OS на самом деле довольно просто:

  1. Загрузите исходный код libxslt и распакуйте его.
  2. Добавьте каталог "libxslt" в Пути поиска заголовка в настройках сборки. Также добавьте туда путь к заголовочным файлам libxml (обычно /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include/libxml2).
  3. Добавьте libxml2.2.dylib и libxslt.dylib в связанные рамки (панель «Группы и файлы» Xcode: щелкните правой кнопкой мыши «Frameworks» -> «Add» -> «Existing Frameworks») ... ").
  4. Создание простого XML-файла и его преобразование XSL.

И, наконец, вы можете использовать код, аналогичный приведенному выше примеру, чтобы получить результат преобразования в NSString (например, для отображения в 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();
7 голосов
/ 08 ноября 2010

Как отмечает Лу Франко, на iPhone нельзя использовать dlilibs.

Он будет отлично работать в разработке как на симуляторе, так и на телефоне, но будет отклонен, как только вы отправите его на утверждение в Apple. Мое приложение было отклонено в течение примерно 20 минут, предположительно, из-за инструмента автоматического статического анализа.

Вместо этого загрузите исходный код, добавьте его в свой проект, свяжите LibXML2.2.dylib (не спрашивайте меня, почему этот dylib разрешен, а XSLT нет!) И соберите проект. Это почти все, что вам нужно сделать. Благодарю Лу за это, поскольку именно он указал мне правильное направление.

5 голосов
/ 20 января 2009

Боюсь, ситуация с xslt довольно мрачная. Класс NSXMLDocument был бы способом сделать это, но Apple вытащила его из iPhone.

TouchXML планирует поддержку xslt, но пока не имеет ее.

Единственный известный мне вариант - использовать libxslt , который поддерживает xslt 1.0 и некоторые расширения exslt .

2 голосов
/ 23 сентября 2013

Для всех, кто обновляет XCode 5 + iOS7 baseSDK, вы заметите, что если вы включили libxslt-1.1.26 в свой проект и скомпилировали его из исходного кода, он использовал предыдущую версию libxml. В последней версии SDK libxml был обновлен, и вам необходимо обновить его до libxslt-1.1.28.

Когда вы загружаете последний файл .tar.gz, все, что вам нужно включить в ваш проект в первый раз:

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

Но config.h и libxslt/xsltconfig.h пока не существуют. У них есть суффикс .in. Вам нужно будет либо запустить сценарий ./configure, либо, если он не работает прямо из коробки, тогда обманывайте, как я.

Шаг 1 - 0 отличий

Просто создайте новую копию config.h.in с именем config.h.

Шаг 2 - 12 отличий

Просто создайте новую копию libxslt/xsltconfig.h.in с именем libxslt/xsltconfig.h.

Первые четыре изменения - просто номера версий.

  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"

Следующие четыре

  1. #if @WITH_XSLT_DEBUG@ -> #if 1 // Просто замените @WITH_XSLT_DEBUG@ на 1
  2. #if @WITH_MEM_DEBUG@ -> #if 1
  3. #if @WITH_TRIO@ -> #if 0
  4. #if @WITH_DEBUGGER@ -> #if 1

последние четыре

  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

    Шаг 3

Теперь, когда вы вручную выполнили шаги, которые выполнил бы ./configure, вы можете следовать инструкциям, описанным ранее для добавления файлов libxslt в ваш проект:

  • config.h
  • libxslt/*.h
  • libxslt/*.c
2 голосов
/ 26 января 2011

Вы не можете использовать libxslt на iPhone, даже если вы его скомпилируете и соберете сами. Я сделал это, и мое приложение неоднократно отклонялось. Инструменты, используемые процессом AppReview, не различают статически связанные символы в вашем коде и динамически связанные символы из iOS. Другими словами, если вам кажется, что вы используете libxslt, ваше приложение будет отклонено, потому что магазин приложений не может определить, используете ли вы частный API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...