2009-01-20 13 views
14

मैं अपने आईफोन एप्लिकेशन में एक्सएमएल/एक्सएसएलटी का उपयोग करने की योजना बना रहा हूं।आईफोन में एक्सएसएलटी का संस्करण

एक्सएसएलटी का वर्तमान संस्करण वर्तमान में आईफोन पर समर्थित है? क्या मैं एक्सएसएलटी 2.0 या सिर्फ 1.0 का उपयोग कर सकता हूं?

उत्तर

15

iPhone OS पर libxslt का उपयोग करना वास्तव में काफी आसान है:

  1. Download the source-code of libxslt और उसे निकालने के।
  2. अपनी बिल्ड सेटिंग्स में "libxslt" dir शीर्षलेख खोज पथ जोड़ें। साथ ही, libxml-headers के पथ को जोड़ें (आमतौर पर /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include/libxml2)।
  3. जुड़ा हुआ व्यवस्थाएं करने के लिए libxml2.2.dylib और libxslt.dylib जोड़े (Xcode "समूह & फ़ाइलें" पैनल: सही पर "फ़्रेमवर्क" पर क्लिक करें -> "जोड़ें" -> "मौजूदा व्यवस्थाएं ...")।
  4. एक साधारण एक्सएमएल फ़ाइल और उसके एक्सएसएल ट्रान्सफॉर्मेशन बनाएं।

और अंत में आप ऊपर tranformation में परिणाम प्राप्त करने के लिए एक कोड नमूना के लिए इसी तरह उपयोग कर सकते हैं एक 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 पर अनुमति नहीं है। आपको एक स्थिर lib –

+1

बनाने की आवश्यकता है, दुर्भाग्यवश, ऐप्पल इसे अस्वीकार कर देगा। नीचे क्रिस गिल्बर्ट द्वारा टिप्पणियां देखें। चूंकि वे इस डाइलीब के लिए हेडर प्रदान नहीं कर रहे हैं, इसलिए वे सार्वजनिक पुस्तकालय होने के बावजूद इसे एक निजी ढांचा मानते हैं। – Jason

+0

"xsltSaveResultToString (& xmlResultBuffer, और लंबाई, res, sty) पर EXC_BAD_ACCESS त्रुटि प्राप्त करना;" कोई विचार? – docchang

5

मुझे डर है कि xslt स्थिति बल्कि गंभीर है। NSXMLDocument कक्षा ऐसा करने का तरीका होगा लेकिन ऐप्पल ने इसे आईफोन से खींच लिया।

TouchXML xslt समर्थन की योजना है लेकिन अभी तक यह नहीं है।

मुझे पता है कि एकमात्र विकल्प सीधे libxslt का उपयोग करना है, जो xslt 1.0 और exslt एक्सटेंशन का समर्थन करता है।

7

लो फ्रेंको बताते हैं के रूप में, आप आईफोन पर डिलिब की अनुमति नहीं है।

यह सिम्युलेटर और फोन दोनों में विकास में ठीक काम करेगा, लेकिन जैसे ही आप इसे ऐप्पल को स्वीकृति के लिए सबमिट करेंगे, इसे अस्वीकार कर दिया जाएगा। मेरा ऐप लगभग 20 मिनट के भीतर खारिज कर दिया गया था, संभवतः उनके स्वचालित स्थिर विश्लेषण उपकरण द्वारा।

इसके बजाय, स्रोत डाउनलोड करें, इसे अपनी परियोजना में जोड़ें, LibXML2.2.dylib को लिंक करें (मुझसे पूछें कि इस डिलिब की अनुमति क्यों है लेकिन एक्सएसएलटी नहीं है!) और प्रोजेक्ट का निर्माण करें। आपको बस इतना करना है। इसके लिए लो को श्रेय दिया क्योंकि वह मुझे सही दिशा में इंगित करता था।

+2

libxslt का सिरदर्द का उपयोग कर रहा है? - हां कुछ हद तक, लेकिन यह असंभव नहीं है। सबसे अच्छी बात यह है कि आप LIBXSLT के लिए स्रोत कोड डाउनलोड कर सकते हैं और अपने एक्सकोड प्रोजेक्ट में किसी फ़ोल्डर में 40 या तो फ़ाइलें (20 .m और 20 .h फ़ाइलें) शामिल कर सकते हैं। एक बार जब आप libxml2.2.dylib जोड़ चुके हैं (विचित्र रूप से यह डाइलीब स्वीकार्य है!) ढांचा, LIBXSLT का स्रोत कोड मुख्य प्रोजेक्ट के हिस्से के रूप में संकलित किया जाएगा और आपके ऐप के संबंध में आपको कोई समस्या नहीं होगी असमर्थित एपीआई का उपयोग करने के लिए खारिज कर दिया गया। –

+0

इस तरह संकलित नहीं कर सकता। 'config.h' फ़ाइल नहीं मिली ' – surfrider

2

आप आईफोन पर libxslt का उपयोग नहीं कर सकते हैं भले ही आप इसे संकलित करते हैं और इसे स्वयं बनाते हैं। मैंने ऐसा किया है और मेरे ऐप को बार-बार खारिज कर दिया है। AppReview प्रक्रिया द्वारा उपयोग किए जाने वाले टूल आपके कोड में स्थिर रूप से जुड़े प्रतीकों और आईओएस से गतिशील रूप से जुड़े प्रतीकों के बीच अंतर नहीं करते हैं। दूसरे शब्दों में, यदि ऐसा लगता है कि आप libxslt का उपयोग कर रहे हैं, तो आपका ऐप खारिज कर दिया जाएगा क्योंकि ऐपस्टोर यह नहीं बता सकता कि आप एक निजी एपीआई का उपयोग कर रहे हैं या नहीं।

+0

स्रोत से इसका उपयोग करना पूरी तरह से स्वीकार्य है क्योंकि यह आपका स्रोत है। ऐपस्टोर आपको स्वचालित रूप से अस्वीकार कर देगा यदि आपके पास अभी भी गतिशील रूप से लिंक की गई लाइब्रेरी का संदर्भ है।आप libxslt को स्थिर लाइब्रेरी के रूप में बना सकते हैं और इसे लिंक कर सकते हैं क्योंकि आप समीक्षा के लिए एक बार में अपनी सभी बाइनरी पेश कर रहे हैं। libxslt-1.1.26 में एक ज्ञात सुरक्षा समस्या है ... संभावित रूप से ऐप्पल जानबूझकर आपको प्रदान की गई एक दोषपूर्ण लाइब्रेरी का उपयोग क्यों नहीं करना चाहता। मुझे लगता है कि यह libxslt-1.1.28 में तय है –

2

XCode 5 + iOS7 baseSDK को अद्यतन करने के हर किसी के लिए, आप है कि अगर आप अपनी परियोजना में libxslt-1.1.26 शामिल है और स्रोत से संकलित, यह libxml का पिछला संस्करण उपयोग कर रहा था देखेंगे। नवीनतम आधार में एसडीके libxml अपडेट किया गया है और इस तरह आपको libxslt-1.1.28 पर अपडेट करने की आवश्यकता होगी।

जब आप नवीनतम .tar.gz फाइल डाउनलोड सब आप पहली बार अपने प्रोजेक्ट में शामिल करने के लिए की जरूरत है:

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

लेकिन config.h और libxslt/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 आप प्रदर्शन किया है | कर सकते हैंजोड़ने के लिए पहले उल्लिखित निर्देशों का पालन करें अपनी परियोजना के लिए 0 फाइलें:

  • config.h
  • libxslt/*.h
  • libxslt/*.c
संबंधित मुद्दे