2009-01-20 21 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