2010-06-18 13 views
68

को प्रतिस्थापित करता है मुझे वास्तव में एक्सएसएल नहीं पता है लेकिन मुझे इस कोड को ठीक करने की आवश्यकता है, मैंने इसे आसान बनाने के लिए इसे कम कर दिया है।
मैं इस लाइनएक्सएसएलटी स्ट्रिंग

<xsl:variable name="text" select="replace($text,'a','b')"/> 

यह XSL है पर यह त्रुटि

Invalid XSLT/XPath function

हो रही है

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:inm="http://www.inmagic.com/webpublisher/query" version="1.0"> 
    <xsl:output method="text" encoding="UTF-8" /> 

    <xsl:preserve-space elements="*" /> 
    <xsl:template match="text()" /> 

    <xsl:template match="mos"> 
     <xsl:apply-templates /> 

     <xsl:for-each select="mosObj"> 
      'Notes or subject' 
      <xsl:call-template 
       name="rem-html"> 
       <xsl:with-param name="text" select="SBS_ABSTRACT" /> 
      </xsl:call-template> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template name="rem-html"> 
     <xsl:param name="text" /> 
     <xsl:variable name="text" select="replace($text, 'a', 'b')" /> 
    </xsl:template> 
</xsl:stylesheet> 

किसी को भी मुझे बता सकते हैं क्या इसके साथ गलत क्या है?

+0

कृपया ध्यान दें कि 'प्रतिस्थापन() 'फ़ंक्शन XPath 2.0 (और इसलिए XSLT 2.0) से आगे है और नियमित अभिव्यक्ति प्रतिस्थापन का समर्थन करता है। – Abel

उत्तर

119

replace एक्सएसएलटी 1.0 के लिए उपलब्ध नहीं है। अगर आप सचमुच ही साथ एक चरित्र को बदलने की जरूरत है, दूसरी ओर

<xsl:variable name="newtext"> 
    <xsl:call-template name="string-replace-all"> 
     <xsl:with-param name="text" select="$text" /> 
     <xsl:with-param name="replace" select="a" /> 
     <xsl:with-param name="by" select="b" /> 
    </xsl:call-template> 
</xsl:variable> 

:

<xsl:template name="string-replace-all"> 
    <xsl:param name="text" /> 
    <xsl:param name="replace" /> 
    <xsl:param name="by" /> 
    <xsl:choose> 
     <xsl:when test="$text = '' or $replace = ''or not($replace)" > 
      <!-- Prevent this routine from hanging --> 
      <xsl:value-of select="$text" /> 
     </xsl:when> 
     <xsl:when test="contains($text, $replace)"> 
      <xsl:value-of select="substring-before($text,$replace)" /> 
      <xsl:value-of select="$by" /> 
      <xsl:call-template name="string-replace-all"> 
       <xsl:with-param name="text" select="substring-after($text,$replace)" /> 
       <xsl:with-param name="replace" select="$replace" /> 
       <xsl:with-param name="by" select="$by" /> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$text" /> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

के रूप में अनुरोध किया गया:

Codesling एक template for string-replace आप समारोह के लिए एक विकल्प के रूप में उपयोग कर सकते हैं दूसरा, आप translate पर कॉल कर सकते हैं जिसमें एक समान हस्ताक्षर है। कुछ इस तरह ठीक काम करना चाहिए:

<xsl:variable name="newtext" select="translate($text,'a','b')"/> 

इसके अलावा, ध्यान दें, इस उदाहरण में, मैं चर नाम "newtext" में बदल दिया, XSLT चर में अडिग हैं, तो आप आप की तरह $foo = $foo के बराबर नहीं कर सकते आपके मूल कोड में था।

+0

धन्यवाद मार्क, लेकिन अब मुझे यह त्रुटि मिल रही है: अज्ञात XPath एक्सटेंशन फ़ंक्शन को – Aximili

+0

@aximili कहा जाता है, क्षमा करें, एक्सएसएलटी 1.0 और 2.0 उलझन में आया, संपादित ... अब जाने के लिए अच्छा होना चाहिए। –

+0

मैं आपको धन्यवाद धन्यवाद मार्क! – Aximili

30

यहां एक्सएसएलटी फ़ंक्शन है जो सी # के स्ट्रिंग। रीप्लेस() फ़ंक्शन के समान काम करेगा। आपका मुख्य स्ट्रिंग

की जगह: - -:

इस टेम्पलेट 3 पैरामीटर

नीचे

पाठ के रूप में है स्ट्रिंग जो आप चाहते हैं

को बदलने के लिए से: - स्ट्रिंग जो नई स्ट्रिंग

द्वारा उत्तर देगी ई खाका

<xsl:template name="string-replace-all"> 
    <xsl:param name="text" /> 
    <xsl:param name="replace" /> 
    <xsl:param name="by" /> 
    <xsl:choose> 
    <xsl:when test="contains($text, $replace)"> 
     <xsl:value-of select="substring-before($text,$replace)" /> 
     <xsl:value-of select="$by" /> 
     <xsl:call-template name="string-replace-all"> 
     <xsl:with-param name="text" select="substring-after($text,$replace)" /> 
     <xsl:with-param name="replace" select="$replace" /> 
     <xsl:with-param name="by" select="$by" /> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$text" /> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

नमूना नीचे से पता चलता है कि यह कैसे कॉल करने के लिए

<xsl:variable name="myVariable "> 
    <xsl:call-template name="string-replace-all"> 
    <xsl:with-param name="text" select="'This is a {old} text'" /> 
    <xsl:with-param name="replace" select="'{old}'" /> 
    <xsl:with-param name="by" select="'New'" /> 
    </xsl:call-template> 
</xsl:variable> 

तुम भी जानकारी के लिए below URL उल्लेख कर सकते हैं।

+0

xslt 1.0 का उपयोग करना इस पोस्ट/टेम्पलेट ने मेरे लिए काम किया जबकि मार्क इलियट ने नहीं किया। – HostMyBus

11

नोट: मामले में आप मामलों (लंबी पाठ में जैसे नई लाइनें) है उच्च संभावना जहां स्रोत स्ट्रिंग में उदाहरणों की भारी संख्या को बदलने के लिए की जरूरत है के लिए पहले से ही उल्लेख किया algo उपयोग करना चाहते हैं आप ' रिकर्सिव कॉल के कारण StackOverflowException के साथ समाप्त हो जाएगा।

मैं इस मुद्दे का समाधान करने के लिए धन्यवाद Xalan के (कैसे में यह करने के लिए सेक्सन मुड़कर नहीं देखा) में निर्मित जावा प्रकार एम्बेड करना:

<xsl:stylesheet version="1.0" exclude-result-prefixes="xalan str" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xalan="http://xml.apache.org/xalan" 
       xmlns:str="xalan://java.lang.String" 
     > 
... 
<xsl:value-of select="str:replaceAll(
    str:new(text()), 
    $search_string, 
    $replace_string)"/> 
... 
</xsl:stylesheet> 
+0

क्षमा करें अगर मैं गूंगा हूं लेकिन मुझे मिलता है: 'नामस्थान' xalan: // java.lang.String 'से जुड़े एक स्क्रिप्ट या एक्सटेंशन ऑब्जेक्ट नहीं मिल रहा है। –

+0

आपका एक्सएसएलटी इंजन क्या है? –

+0

माइक्रोसॉफ्ट.NET एक मुझे डर है ... –

5

आप नीचे दिए गए कोड जब उपयोग कर सकते हैं आपका प्रोसेसर .NET पर चलता है या एमएसएक्सएमएल का उपयोग करता है (जावा-आधारित या अन्य देशी प्रोसेसर के विपरीत)। यह msxsl:script का उपयोग करता है।

अपने रूट xsl:stylesheet या xsl:transform तत्व पर नामस्थान xmlns:msxsl="urn:schemas-microsoft-com:xslt" जोड़ने के लिए सुनिश्चित करें।

इसके अतिरिक्त, को किसी भी नामस्थान पर बांधें, उदाहरण के लिए xmlns:outlet = "http://my.functions"

<msxsl:script implements-prefix="outlet" language="javascript"> 
function replace_str(str_text,str_replace,str_by) 
{ 
    return str_text.replace(str_replace,str_by); 
} 
</msxsl:script> 


<xsl:variable name="newtext" select="outlet:replace_str(string(@oldstring),'me','you')" /> 
+0

क्षमा करें अगर मैं गूंगा हूं, लेकिन मुझे 'उपसर्ग आउटलेट परिभाषित नहीं किया गया है' या 'xsl: script' 'xsl: स्टाइलशीट' तत्व का बच्चा नहीं हो सकता है। 'यदि मैं अपने उपसर्ग के लिए msxsl बदलता हूं। मुझे लगता है कि यह कुछ माइक्रोसॉफ्ट-विशिष्ट एक्सएसएलटी जादू है? –

+1

@IanGrainger, यह 'xsl: script' नहीं है, लेकिन 'msxsl: script' है, और इसमें एक अलग नामस्थान है (मैंने जॉन का जवाब अपडेट किया है)। – Abel

0

rouine बहुत अच्छी है, लेकिन यह मेरे ऐप लटका का कारण बनता है, तो मैं मामले को जोड़ने के लिए की जरूरत: समारोह रिकर्सिवली कहा जाता हो जाता है

<xsl:when test="$text = '' or $replace = ''or not($replace)" > 
    <xsl:value-of select="$text" /> 
    <!-- Prevent thsi routine from hanging --> 
    </xsl:when> 

से पहले।

मैं यहाँ से जवाब मिला: When test hanging in an infinite loop

धन्यवाद!