2010-02-02 13 views
7

मैं XSLT का उपयोग करने के लिए HTML के लिए एक सरल XML स्कीमा परिवर्तित करने के लिए कोशिश कर रहा हूँ और fn:replace उपयोग करने के लिए <p>; साथ रिटर्न (\n) को बदलने के लिए योजना बनाई से बदलें। हालांकि, मैं यह नहीं समझ सकता कि इस फ़ंक्शन का सही तरीके से उपयोग कैसे करें।का उपयोग XPath समारोह fn: XSLT

XSLT मैं उपयोग कर रहा हूँ का एक सरलीकृत संस्करण में लिखा है:

<?xml version="1.0"?> 

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
    <xsl:template match="/root"> 
    <html> 
     <body> 
     <!-- Replace \n with <p> --> 
     <xsl:value-of select="fn:replace(value, '\n', '<p>')" /> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

और यह XLST के लिए इनपुट, उदा है .:

<?xml version="1.0"?> 

<root> 
    <value><![CDATA[ 
    Hello 
    world! 
    ]]></value> 
</root> 

रूपांतरण एक NoSuchMethodException साथ fn:replace पर विफल रहता है। यदि मैं प्रतिस्थापन कथन को

<xsl:value-of select="fn:replace('somestring', '\n', '<p>')" /> 

पर एक IllegalArgumentException प्राप्त करता है। मैं क्या चाहता हूं प्राप्त करने के लिए fn:replace का उपयोग कैसे करूं?

मैं एक्सएसएलटी का परीक्षण करने के लिए Butterfly XML Editor का उपयोग कर रहा हूं।

उत्तर

7

XPath 2.0 में एक प्रतिस्थापन फ़ंक्शन है जिसका उपयोग आप किसी भी एक्सएसएलटी 2.0 प्रोसेसर जैसे सैक्सन 9 या अल्टोवाएक्सएमएल टूल्स या गेस्टल्ट के साथ कर सकते हैं। आप एक एक्सएसएलटी 1.0 प्रोसेसर के साथ फ़ंक्शन का उपयोग करने का प्रयास करते हैं, जो काम नहीं करेगा। यदि आप एक एक्सएसएलटी 1.0 प्रोसेसर तक ही सीमित हैं तो आपको नामित रिकर्सिव टेम्पलेट या एक्सटेंशन की सहायता से प्रतिस्थापन को लागू करने की आवश्यकता होगी।

हालांकि ध्यान दें कि XSLT 2.0 के साथ भी आपके प्रतिस्थापन का उपयोग करने का प्रयास गलत लगता है क्योंकि आप एक 'पी' टैग मार्कअप के साथ एक टेक्स्ट नोड तैयार करेंगे, जबकि मुझे लगता है कि आप परिणाम में 'पी' तत्व नोड बनाना चाहते हैं। तो XSLT 2.0 के साथ प्रतिस्थापन के बजाय विश्लेषण-स्ट्रिंग का उपयोग करके भी आपको इच्छित परिणाम प्राप्त करने की अधिक संभावना है।

+1

Thx, XSLT 2.0 का उल्लेख करते हुए मुझे सही दिशा में धक्का दिया। के संस्करण विशेषता को बंप करके; 2.0 तक और ; मुझे नौकरी मिल गई। हो सकता है कि विश्लेषण-स्ट्रिंग क्लीनर है लेकिन यह काम पूरा हो जाता है :) – larsmoa

+1

क्या आपने संस्करण को 2.0 पर टक्कर देने के अलावा कुछ और किया था? –

+0

क्या आप मुझे बता सकते हैं कि 2.0 के संस्करण विशेषता को कैसे बंप करना है? –

0

2.0 करने के लिए <xsl:stylesheet> के संस्करण विशेषता जोड़ने से और का उपयोग करके

<xsl:value-of select="replace(description, '\n', '<p/>')" disable-output-escaping="yes" />

मैं की जगह काम करने के लिए सक्षम था।

+0

क्या आप मुझे बता सकते हैं कि 2.0 के संस्करण विशेषता को कैसे बंप करना है? –

+0

@JatinPatel: '' – larsmoa