iPhone中XSLT的版本
我计划在iPhone应用程序中使用XML/XSLTiPhone中XSLT的版本,iphone,cocoa-touch,xslt,Iphone,Cocoa Touch,Xslt,我计划在iPhone应用程序中使用XML/XSLT iPhone目前支持哪一版本的XSLT?我可以使用XSLT 2.0还是仅使用XSLT 1.0?恐怕XSLT的形势相当严峻。NSXMLDocument类将是实现这一点的方法,但苹果从iPhone中推出了它 计划提供xslt支持,但还没有 我知道的唯一选择是直接使用,它支持xslt 1.0和一些扩展。在iPhone操作系统上使用libxslt实际上非常简单: 然后把它提取出来 在构建设置中将“libxslt”目录添加到标题搜索路径中。另外,在那里添
iPhone目前支持哪一版本的XSLT?我可以使用XSLT 2.0还是仅使用XSLT 1.0?恐怕XSLT的形势相当严峻。
NSXMLDocument
类将是实现这一点的方法,但苹果从iPhone中推出了它
计划提供xslt支持,但还没有
我知道的唯一选择是直接使用,它支持xslt 1.0和一些扩展。在iPhone操作系统上使用
libxslt
实际上非常简单:
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include/libxml2
)NSString
(例如,在UIWebView
中显示):
#导入
#进口
#进口
#进口
#进口
#进口
#进口
#进口
#进口
#进口
...
NSString*文件路径=[[NSBundle mainBundle]路径资源:@“article”类型:@“xml”];
NSString*styleSheetPath=[[NSBundle mainBundle]pathForResource:@“article_transform”,类型:@“xml”];
xmlDocPtr文件,res;
//告诉libxml2解析器在解析文件时替换实体
XMLSubstituteEntitysDefault(1);
//这将告诉libxml加载外部实体子集
xmlLoadExtDtdDefaultValue=1;
sty=xsltParseStylesheetFile((const xmlChar*)[styleSheetPath cStringUsingEncoding:NSUTF8StringEncoding]);
doc=xmlParseFile([filePath cStringUsingEncoding:NSUTF8StringEncoding]);
res=xsltaplystylesheet(sty,doc,NULL);
char*xmlResultBuffer=nil;
整数长度=0;
xsltsaveresultostring(&xmlsultbuffer,&length,res,sty);
NSString*result=[NSString stringWithCString:xmlResultBuffer编码:NSUTF8StringEncoding];
NSLog(@“结果:%@”,结果);
免费(xmlResultBuffer);
xsltFreeStylesheet(sty);
xmlFreeDoc(res);
xmlFreeDoc(doc);
xsltCleanupGlobals();
xmlcleanuparser();
正如Lou Franco指出的那样,iPhone上不允许使用DYLIB
它在模拟器和手机的开发中都能正常工作,但一旦你提交给苹果公司批准,它就会被拒绝。我的应用程序在大约20分钟内被拒绝,大概是被他们的自动静态分析工具拒绝了
相反,下载源代码,将其添加到项目中,链接LibXML2.2.dylib(不要问我为什么允许这个dylib,但是XSLT不允许!),然后构建项目。这就是你所要做的。这要归功于卢,因为他为我指明了正确的方向。即使你自己编译并构建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
脚本,或者如果这对你来说不起作用,那么就像我一样作弊
步骤1-0差异
只需在中创建一个名为config.h的新副本
步骤2-12差异
只需创建一个名为libxslt/xsltconfig.h
的libxslt/xsltconfig.h
的新副本
前四个变化只是版本号
#定义LIBXSLT\u版本“1.1.28”
#定义LIBXSLT\u版本10128
\define LIBXSLT\u VERSION\u STRING“10128”
#定义LIBXSLT\u版本\u额外“-GITv1.1.28”
#if@WITH_XSLT_DEBUG@
->#if 1
//只需将@替换为
WITH1
#if@带有_MEM_DEBUG@
->#if 1
#if@WITH_TRIO@
->#if 0
#if@带调试器@
->#if 1
#if@带有_模块
->#if 1
\define LIBXSLT\u DEFAULT\u PLUGINS\u PATH()“@LIBXSLT\u DEFAULT\u PLUGINS\u PATH@”
->\define LIBXSLT\u DEFAULT\u PLUGINS\u PATH()“/usr/lib/LIBXSLT PLUGINS”
\if@XSLT\u LOCALE\u XLOCALE@
->\if 1
#if@XSLT\u LOCALE\u WINAPI@
->#if 0
步骤3/configure
将要执行的步骤,您可以按照前面概述的说明将libxslt
文件添加到项目中:
config.h
libxslt/*.h
libxslt/*.c
#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();