2009-01-20 37 views
14

我打算在iPhone应用程序中使用XML/XSLT。iPhone中的XSLT版本

iPhone上当前支持哪种版本的XSLT?我可以使用XSLT 2.0还是只使用1.0?

回答

15

在iPhone OS使用libxslt其实很简单:

  1. Download the source-code of libxslt和解压。
  2. 在您的构建设置中将“libxslt”目录添加到标题搜索路径。另外,在那里添加路径到libxml-headers(通常为/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include/libxml2)。
  3. 添加libxml2.2.dylib和libxslt.dylib到链接框架(Xcode的“组&文件”面板:右键点击“框架” - >“添加” - >“现有的框架......” )。
  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(); 
+2

dylibs不允许在iPhone上。您需要创建一个静态库 – 2010-07-22 00:20:54

+1

不幸的是,苹果会拒绝这个。请参阅下面的Chris Gilbert的评论。由于他们没有提供这个dylib的标题,他们认为它是一个私人框架,尽管它是一个公共图书馆。 – Jason 2010-11-25 16:06:05

+0

在“xsltSaveResultToString(&xmlResultBuffer,&length,res,sty)”上获取EXC_BAD_ACCESS错误;“有任何想法吗? – docchang 2015-01-21 19:45:40

5

恐怕xslt的情况相当严峻。 NSXMLDocument课程将是实现这一目标的方式,但苹果将其从iPhone中解放出来。

TouchXML计划xslt支持,但还没有它。

我知道的唯一选择是直接使用libxslt,它支持xslt 1.0和一些exslt扩展。

7

娄佛朗哥指出,你在iPhone上不允许使用dylibs。

它可以在模拟器和手机的开发过程中正常工作,但只要您将其提交给Apple审批,它就会被拒绝。大概20分钟内我的应用程序就被拒绝了,大概是他们的自动静态分析工具。

取而代之,下载源代码并将其添加到您的项目中,并链接LibXML2.2.dylib(不要问我为什么这个dylib是允许的,但XSLT不是!)并构建项目。这几乎是你所要做的。因为这是他指出我正确的方向,所以信赖Lou。

2

即使您自己编译并构建它,也不能在iPhone上使用libxslt。我已经这样做了,并且我的应用程序被拒绝了。 AppReview过程使用的工具不会区分代码中的静态链接符号和iOS中动态链接的符号。换句话说,如果看起来您使用的是libxslt,则您的应用程序将被拒绝,因为appstore无法分辨您是否使用私有API。

2

对于每个更新到XCode 5 + iOS7 baseSDK的人,您都会注意到,如果您在项目中包含libxslt-1.1.26并从源代码进行编译,则会使用之前版本的libxml。在最新的基础SDK libxml已更新,因此您需要更新至libxslt-1.1.28

当您下载最新.tar.gz文件都需要包含到项目中首次有:

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

config.hlibxslt/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 @[email protected] - >#if 1 //只需>#if 1
  2. #if @[email protected] - - 与1
  3. #if @[email protected]更换@[email protected]>#if 0
  4. #if @[email protected] - >#if 1

最后四个

  1. #if @[email protected] - >#if 1
  2. #define LIBXSLT_DEFAULT_PLUGINS_PATH() "@[email protected]" - >#define LIBXSLT_DEFAULT_PLUGINS_PATH() "/usr/lib/libxslt-plugins"
  3. #if @[email protected] - >#if 1
  4. #if @[email protected] - >#if 0

    步骤3

现在您已经手动执行的步骤是./configure会执行,你可以请按照前面列出的说明添加libxslt文件到您的项目:

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