![]() |
XSLT 2.0 replace < > special characters
I am trying to do a search and replace on an element with a regex. The
problem I am having is on the replace. I am looking for any http(s) strings and needing to create an href out of it. This code below works for replace any http(s) with say a text result such as "fred" or "bob" - for example. You can see what I am trying to do with it though with the a href. I am using XML Spy on a windows platform. <xsl:template match="whatever"> <xsl:copy> <xsl:value-of select='replace(.,"(https?:\/\/[^\s]*)", "<a href=$1>$1</a>")'/> </xsl:copy> </xsl:template> The element in this case "whatever" could have multiple http references and are contained in a text element of arbitrary content and length. So, with that being said, the below example is not what I'm looking for as someone has already pointed out. I have tried something similar to no avail. <xsl:template match="//addr"> <xsl:element name="a"> <xsl:attribute name="href"> <xsl:value-of select="."/> </xsl:attribute> <xsl:value-of select="."/> </xsl:element> </xsl:template> I need to be able to escape the "<" & ">" characters or change my approach entirely... I think this would prove to be a valuable tool if it were to work. -Matt |
Re: XSLT 2.0 replace < > special characters
mattmozer@gmail.com wrote: > I am trying to do a search and replace on an element with a regex. The > problem I am having is on the replace. I am looking for any http(s) > strings and needing to create an href out of it. > This code below works for replace any http(s) with say a text result > such as "fred" or "bob" - for example. You can see what I am > trying to do with it though with the a href. I am using XML Spy on a > windows platform. > > <xsl:template match="whatever"> > <xsl:copy> > <xsl:value-of select='replace(.,"(https?:\/\/[^\s]*)", "<a > href=$1>$1</a>")'/> > </xsl:copy> > </xsl:template> > > The element in this case "whatever" could have multiple http > references and are contained in a text element of arbitrary content and > length. Here is an example input that I hope is what you intend to have: <?xml version="1.0" encoding="UTF-8"?> <root> <p>This is a text with a link: http://www.example.com/ followed by another link: http://www.example.org/2005/04/26</p> </root> Then this stylesheet <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="html" indent="yes" encoding="UTF-8" /> <xsl:template match="/"> <html> <head> <title>regular expression example</title> </head> <body> <xsl:apply-templates select="//p" /> </body> </html> </xsl:template> <xsl:template match="p"> <xsl:copy> <xsl:apply-templates select="node()" mode="make-links" /> </xsl:copy> </xsl:template> <xsl:template match="*" mode="make-links"> <xsl:apply-templates select="." /> </xsl:template> <xsl:template match="text()" mode="make-links"> <xsl:analyze-string select="." regex="https?://[^\s]*"> <xsl:matching-substring> <a href="{regex-group(0)}"><xsl:value-of select="regex-group(0)" /></a> </xsl:matching-substring> <xsl:non-matching-substring> <xsl:value-of select="." /> </xsl:non-matching-substring> </xsl:analyze-string> </xsl:template> </xsl:stylesheet> gives the following output: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>regular expression example</title> </head> <body> <p>This is a text with a link: <a href="http://www.example.com/">http://www.example.com/</a> followed by another link: <a href="http://www.example.org/2005/04/26">http://www.example.org/2005/04/26</a></p> </body> </html> -- Martin Honnen http://JavaScript.FAQTs.com/ |
| All times are GMT. The time now is 07:24 PM. |
Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.