Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1618
  • Last Modified:

Replace CRLF with <P> in XSL

I have some XSL like this,

  <xsl:copy-of select="$datavalue" />

and datavalue contains carriage return/line feed characters.  Is it possible (in XSL) to replace the CRLF with a "<P/>" tag for correct rendering in HTML?

In Visual Basic, I would just do:

  mystr=Replace(mystr, chr$(13), "<P/>")

0
anthony_glenwright
Asked:
anthony_glenwright
1 Solution
 
MinnaCommented:
Try the translate(value, from, to) function
0
 
anthony_glenwrightAuthor Commented:
I tried translate - it doesn't work the way you would think, since it replaces matching characters from the second string with those in the same position in the 3rd string...

i.e. translate ("AAA", "AZZ", "RRR") = "RAA"

strange that they would even make up such a strange function...

PS:  Are you the minna that I know?


0
 
robbertCommented:
I do that by a server-side VBScript script. If there'll be no XSLT solution, I'll post it.
0
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

 
MFlintCommented:
Anthony,

Check out this page (which is where I learned this trick):
http://www.dpawson.co.uk/xsl/sect2/replace.html

Then try something like this:

     <xsl:template match="text()" priority="2">          <!-- Increase priority to avoid warning messages about duplicate templates -->
          <xsl:call-template name="break"/>
     </xsl:template>
     

     <xsl:template name="break">                         <!-- Converts any #xa characters into <br/> tags for display.  -->
          <xsl:param name="text" select="."/>
          <xsl:choose>
               <xsl:when test="contains($text, '&#xa;')">
                    <xsl:value-of select="substring-before($text, '&#xa;')"/>
                    <br/>
                    <xsl:call-template name="break">
                         <xsl:with-param name="text" select="substring-after($text, '&#xa;')"/>
                    </xsl:call-template>
               </xsl:when>
               <xsl:otherwise>
                    <xsl:value-of select="$text"/>
               </xsl:otherwise>
          </xsl:choose>
     </xsl:template>

0
 
MFlintCommented:
Minna and Anthony,

FYI about the xPath function 'translate()', check out this page:
http://www.w3.org/TR/xpath#function-translate

----------------------------------

The translate function returns the first argument string with occurrences of characters in the second argument string replaced by the character at the corresponding position in the third argument string. For example, translate("bar","abc","ABC") returns the string BAr. If there is a character in the second argument string with no character at a corresponding position in the third argument string (because the second argument string is longer than the third argument string), then occurrences of that character in the first argument string are removed. For example, translate("--aaa--","abc-","ABC") returns "AAA". If a character occurs more than once in the second argument string, then the first occurrence determines the replacement character. If the third argument string is longer than the second argument string, then excess characters are ignored.

NOTE: The translate function is not a sufficient solution for case conversion in all languages. A future version of XPath may provide additional functions for case conversion.

----------------------------------

Mostly I've used it to convert from one case to another, so for example I'll have something like this at the very top of my XSL file:

<!DOCTYPE xsl:stylesheet [
     <!ENTITY indenthtml "no">
     <!-- NOTE: Change indenthtml indent to "yes" for debugging generated HTML and "no" for code optimized for production -->
     <!ENTITY nbsp "&#160;">
     <!ENTITY bgcolor1 "#FFFFFF">     <!-- white -->
     <!ENTITY bgcolor2 "#CC6600">     <!-- dark orange  -->
     <!ENTITY bgcolor3 "#FFCC66">     <!-- light orange -->
     <!ENTITY txtcolor1 "#000000">     <!-- black -->
     <!ENTITY compWidth "670">          <!-- Component width / width of table that holds the component -->
     <!ENTITY lowerCase "abcdefghijklmnopqrstuvwxyz">
     <!ENTITY upperCase "ABCDEFGHIJKLMNOPQRSTUVWXYZ">
]>


Then later in the document I could do something like:

               <td  width="16%" valign="top" class="MOIDocText">
                    <xsl:value-of select="translate(LIMITS/DETAIL[1]/TYPE, '&lowerCase;', '&upperCase;')"/>
                    <xsl:text>&nbsp;</xsl:text>
               </td>

0
 
anthony_glenwrightAuthor Commented:
Thanks all - I ended up solving a different way (at the database end), but MFlint's answer is a solution...
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now