Версия XSLT в iPhone

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

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

Ответ 1

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

  • Загрузите исходный код libxslt и извлеките его.
  • Добавьте в каталог параметры "libxslt" в пути поиска заголовков. Кроме того, добавьте путь к заголовкам libxml (обычно /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include/libxml2).
  • Добавьте libxml2.2.dylib и libxslt.dylib в связанные рамки (панель "Группы и файлы" Xcode: щелкните правой кнопкой мыши на "Frameworks" → "Добавить" → "Существующие Каркасы..." ).
  • Создайте простой 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();

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Для каждого обновления до 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 script, либо если это не работает прямо из коробки, а затем обманывайте, как я.

Шаг 1 - 0 различий

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

Шаг 2 - 12 различий

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

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

  • #define LIBXSLT_DOTTED_VERSION "1.1.28"
  • #define LIBXSLT_VERSION 10128
  • #define LIBXSLT_VERSION_STRING "10128"
  • #define LIBXSLT_VERSION_EXTRA "-GITv1.1.28"

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

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

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

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