এক্সএসএলটি স্ট্রিং প্রতিস্থাপন করুন


86

আমি আসলে এক্সএসএলকে জানি না তবে আমার এই কোডটি ঠিক করতে হবে, এটিকে আরও সহজ করার জন্য আমি এটি হ্রাস করেছি।
আমি এই ত্রুটি পাচ্ছি

অবৈধ এক্সএসএলটি / এক্সপথ ফাংশন

এই লাইনে

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

এটি এক্সএসএল

<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>

কেউ কি আমাকে বলতে পারেন যে এতে কী হয়েছে?


দয়া করে নোট করুন যে replace()ফাংশনটি এক্সপথ ২.০ (এবং তাই এক্সএসএলটি ২.০) থেকে পাওয়া যাচ্ছে এবং নিয়মিত এক্সপ্রেশন প্রতিস্থাপনকে সমর্থন করে।
আবেল

উত্তর:


150

replace এক্সএসএলটি 1.0 এর জন্য উপলব্ধ নয়।

কোডসিংয়ের স্ট্রিং- রিপ্লেসের জন্য একটি টেমপ্লেট রয়েছে যা আপনি কার্যটির বিকল্প হিসাবে ব্যবহার করতে পারেন:

<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>

হিসাবে আহবান:

<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>

অন্যদিকে, আপনি যদি আক্ষরিকভাবে কেবল একটি চরিত্রের সাথে অন্যটির সাথে প্রতিস্থাপন করতে চান তবে আপনি কল করতে পারেন translateযার অনুরূপ স্বাক্ষর রয়েছে। এর মতো কিছুতে ভাল কাজ করা উচিত:

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

এছাড়াও, নোট করুন, উদাহরণস্বরূপ, আমি ভেরিয়েবলের নামটি "নিউটেক্সট" এ পরিবর্তন করেছিলাম, এক্সএসএলটি ভেরিয়েবলগুলি অপরিবর্তনীয়, তাই আপনি $foo = $fooনিজের মূল কোডটিতে যেমন পছন্দ করেছিলেন তেমন সমান করতে পারবেন না ।


ধন্যবাদ মার্ক, তবে এখন আমি এই ত্রুটিটি পাচ্ছি: অজানা
এক্সপথ

@ ম্যাক্সিমিলি, দুঃখিত, এক্সএসএলটি ১.০ এবং ২.০ বিভ্রান্ত হয়ে পড়েছে, সম্পাদিত হয়েছে ... এখন যাওয়াই ভাল হওয়া উচিত।
মার্ক এলিয়ট

19
এই উত্তরটি ভুল! এক্সএসএলটি-তে প্রতিস্থাপন ফাংশনটি একই স্ট্রাক্টারের পরিবর্তে পুরো স্ট্রিংকে নয়! উদাহরণস্বরূপ এখানে দেখুন: w3schools.com
এক্সপ্যাথ

12
@ জাকুব আপনি যা ভাবছেন translate, তা নয় replacereplaceজন্য XPath ফাংশন হিসেবে তার দ্বিতীয় যুক্তি 2.0 একইরূপে রেগুলার এক্সপ্রেশন এবং প্রতিস্থাপিত নির্দিষ্ট প্রতিস্থাপন স্ট্রিং (যা অন্তর্ভুক্ত হতে পারে যে মত প্রকাশের সব ম্যাচ $nRegex মধ্যে ক্যাপচার গোষ্ঠীতে রেফারেন্স)। translateফাংশন (1.0 এবং 2.0 মধ্যে) এক যে একক-অক্ষর-জন্য-একক-অক্ষর প্রতিস্থাপন করে।
ইয়ান রবার্টস

6
উদাহরণের ব্যবহারের 4 র্থ লাইনটি এ এর <xsl:with-param name="replace" select="'a'" />চারপাশে থাকা উক্তিগুলির সাথে হওয়া উচিত নয় ?
ডিজেএল

37

এখানে এক্সএসএলটি ফাংশন রয়েছে যা সি # এর স্ট্রিং.প্লেস () ফাংশনের অনুরূপ কাজ করবে।

এই টেমপ্লেটটির নীচে 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>

আপনি বিশদটির জন্য নীচের URL টিও উল্লেখ করতে পারেন ।


4
Xslt 1.0 ব্যবহার করে এই মার্ক / এলিওটস না করে এমন পোস্ট / টেমপ্লেটটি আমার পক্ষে কাজ করেছিল।
হোস্টমাইবাস

12

দ্রষ্টব্য: যদি আপনি উত্স স্ট্রিংয়ে উদাহরণস্বরূপ প্রচুর সংখ্যক প্রতিস্থাপন করতে চান এমন ক্ষেত্রে ইতিমধ্যে উল্লিখিত আলগোটি ব্যবহার করতে চান (উদাহরণস্বরূপ দীর্ঘ পাঠ্যে নতুন রেখাগুলি) উচ্চ সম্ভাবনা রয়েছে যা আপনি 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>

দুঃখিত যদি আমি বোবা হয়ে যাচ্ছি তবে আমি পেয়েছি:Cannot find a script or an extension object associated with namespace 'xalan://java.lang.String'.
ইয়ান গ্রেনার

আপনার এক্সএসএলটি ইঞ্জিনটি কী?
মিলান আলেক্সিć

4
আমার মন্তব্যটি সর্বাধিক জনপ্রিয় জাভা এক্সএসএলটি ১.০ ইঞ্জিন জালান ( xml.apache.org/xalan-j ) এর জন্য ছিল, যা উপলব্ধ জাভা ক্লাসপাথের ভিতরে উপলব্ধ ধরণের জন্য সরাসরি ম্যাপিং সমর্থন করে; আপনি নেট সমাধানের জন্য আমার সমাধান প্রয়োগ করতে পারবেন না
মিলান আলেক্সিć

@ ইয়ানগ্রানগার, আপনি এটি একটি <msxsl:script>ব্লক যোগ করে .NET দিয়ে ব্যবহার করতে পারেন যা কোনও .NET পদ্ধতি, গ্রন্থাগার ইত্যাদি কল করতে পারে যদিও। নেট এছাড়াও এক্সএসএলটি এক্সটেনশন ফাংশন সমর্থন করে, তাই আপনার প্রয়োজন হবে না।
আবেল

exslt এছাড়াও সমর্থিত libxslt এবং সেইজন্য সমস্ত সন্তান মধ্যে xsltproc ইত্যাদি ...
তথ্যের Pannetier

7

যখন আপনার প্রসেসর .NET চালু থাকে বা MSXML ব্যবহার করে (জাভা ভিত্তিক বা অন্যান্য নেটিভ প্রসেসরের বিপরীতে) আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন। এটি ব্যবহার করে msxsl:script

xmlns:msxsl="urn:schemas-microsoft-com:xslt"আপনার শিকড় xsl:stylesheetবা xsl:transformউপাদানটিতে নেমস্পেস যুক্ত করার বিষয়টি নিশ্চিত করুন ।

এছাড়াও, outletউদাহরণস্বরূপ, আপনার পছন্দ মতো যে কোনও নেমস্পেসের সাথে আবদ্ধ করুন 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')" />

দুঃখিত যদি আমি বোবা হয়ে যাচ্ছি তবে আমি পেয়েছি prefix outlet is not definedবা 'xsl:script' cannot be a child of the 'xsl:stylesheet' element.আমার উপসর্গের জন্য যদি এমএসএক্সএসএল পরিবর্তন করি। আমি অনুমান করছি এটি কি কিছু মাইক্রোসফ্ট-নির্দিষ্ট এক্সএসএলটি যাদু?
ইয়ান গ্রেনার

4
@ ইয়ানগ্রানগার, এটি xsl:scriptনয় msxsl:script, এবং এর আলাদা আলাদা নাম রয়েছে (আমি জনের উত্তর আপডেট করেছি)।
আবেল

1

আমি এই উত্তর মারতে থাকি। তবে তাদের মধ্যে কেউই এক্সলস্টপ্রোকের (এবং সম্ভবত বেশিরভাগ এক্সএসএলটি ১.০ প্রসেসরের) সবচেয়ে সহজ সমাধানের তালিকা দেয় না:

  1. স্টাইলসীটে এক্সস্টল্ট স্ট্রিংয়ের নাম যুক্ত করুন, যেমন:
<xsl:stylesheet
  version="1.0"
  xmlns:str="http://exslt.org/strings"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  1. তারপরে এটি ব্যবহার করুন:
<xsl:value-of select="str:replace(., ' ', '')"/>

4
আমার কম্পিউটারে এক্সস্লটপ্রোক (ম্যাকোস 10.13) str:replace()ফাংশনটি সমর্থন করে না । অন্য কোনও বড় এক্সএসএলটি 1.0 প্রসেসরের কোনওটিই নয় - জালান, স্যাকসন 6.5 এবং মাইক্রোসফ্ট
michael.hor257k

0

রাউইনটি বেশ ভাল, তবে এটি আমার অ্যাপ্লিকেশনটিকে স্তব্ধ করে তোলে তাই আমার কেসটি যুক্ত করা দরকার:

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

ফাংশনটি পুনরাবৃত্তভাবে বলা হওয়ার আগে।

আমি এখান থেকে উত্তর পেয়েছি: যখন পরীক্ষা অসীম লুপে ঝুলন্ত থাকে

ধন্যবাদ!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.