Я планирую использовать XML/XSLT в своем приложении для iPhone.
Какая версия XSLT в настоящее время поддерживается на iPhone? Могу ли я использовать XSLT 2.0 или всего 1.0?
Я планирую использовать XML/XSLT в своем приложении для iPhone.
Какая версия XSLT в настоящее время поддерживается на iPhone? Могу ли я использовать XSLT 2.0 или всего 1.0?
Использование libxslt
в iPhone OS на самом деле довольно просто:
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include/libxml2
).И, наконец, вы можете использовать код, аналогичный приведенному выше примеру, чтобы получить результат преобразования в 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();
Как отмечает Лу Франко, вам не разрешается использовать dylib на iPhone.
Он отлично справится с разработкой как в симуляторе, так и в телефоне, но будет отклонен, как только вы отправите его на утверждение Apple. Мое приложение было отклонено в течение примерно 20 минут, предположительно, благодаря их автоматическому инструменту статического анализа.
Вместо этого загрузите источник, добавьте его в свой проект, свяжите LibXML2.2.dylib(не спрашивайте меня, почему этот dylib разрешен, но XSLT - нет!) и создайте проект. Это почти все, что вам нужно сделать. Кредит Лу за это, как это он указал мне в правильном направлении.
Я боюсь, что ситуация xslt довольно мрачная. Класс NSXMLDocument
был бы способом сделать это, но Apple вытащил его из iPhone.
TouchXML поддерживает поддержку xslt, но еще не имеет его.
Единственный вариант, о котором я знаю, - это напрямую использовать libxslt, который поддерживает xslt 1.0 и некоторые exslt расширения.
Вы не можете использовать libxslt на iPhone, даже если вы его компилируете и сами создаете. Я сделал это и неоднократно отклонял свое приложение. Инструменты, используемые процессом AppReview, не различают статически связанные символы в коде и динамически связанные символы из iOS. Другими словами, если вы используете libxslt, ваше приложение будет отклонено, потому что Appstore не может определить, используете ли вы частный API.
Для каждого обновления до 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"
Следующие четыре
#if @[email protected]
→ #if 1
//Просто замените @[email protected]
на 1
#if @[email protected]
→ #if 1
#if @[email protected]
→ #if 0
#if @[email protected]
→ #if 1
Последние четыре
#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
Шаг 3
Теперь, когда вы вручную выполнили шаги, которые выполнил бы ./configure
, вы можете следовать инструкциям, изложенным ранее, для добавления файлов libxslt
в ваш проект:
config.h
libxslt/*.h
libxslt/*.c