Click to See Complete Forum and Search --> : tag escaping
I have to convert a xml file to html
i have a template matching eache tag (<b><i>...)
i have to escape the <br> tag when a <a> tag are following
ex. <br>text = carriage return + text
but
<br><a href>text</a> = text
any suggestion?
Khalid Ali
09-08-2003, 07:11 PM
:confused: :confused: ...confused....did not understand
sorry for my english.
i have an xml file and i convert it in html.
<xml>
<p>some text<br/>some text</p>
<p>some text<br/>some text</br><a>link</a></p>
</xml>
i want to grab all the <br/> except the one before the <a>
lillu
09-25-2003, 04:34 PM
Hi,
Just some comments on your xml.
It should be well-formed like this:
1. xml declaration on the first line
2. you must include 1 root element, eg. <p>
3. you must include both start <br> and end </br> tags
4. elements must be properly nested
5. empty elements must be used like this: <br />
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="escaping.xsl"?>
<p>
<br>some text</br>
<br>some text</br>
<br>some text</br>
<br>some text</br>
<br><a>some link</a></br>
<br>some text</br>
<br>some text</br>
<br>some text</br>
<br>some text</br>
</p>
If I get it right, you want a result html, where a line break is inserted after each text node except before a link node?
The following xsl stylesheet uses xpath expressions to find the node containing a child named <a>.
It also uses <xsl:choose> to control where to place a line break.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head><title>Sample XSL Stylesheet</title></head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="br">
<xsl:choose>
<xsl:when test="child::*[1][self::a]"><xsl:value-of select="." /><xsl:text> </xsl:text></xsl:when>
<xsl:otherwise><xsl:value-of select="." /><br /></xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
HTH,
lillu
09-30-2003, 07:07 AM
I made some improvement in the code:
1. I put <br/> before the value-of tag so the line break will occur before the outputted value, as Mr R asked for.
<xsl:oherwise><br/><xsl:value-of select="."/></xsl:otherwise>
2. I was messing around with that axis thing then found out that <xsl:when test="a"> is of course a much simpler way of selecting a node.
3. I used ... xml:space="preserve">space<xsl:value-of ... instead of <xsl:text> </xsl:text>
Here's the entire xsl file.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head><title>Sample XSL Stylesheet</title></head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="br">
<xsl:choose>
<xsl:when test="a" xml:space="preserve"> <xsl:value-of select="."/></xsl:when>
<xsl:otherwise><br/><xsl:value-of select="."/></xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
I'm very new to xml, xsl so I would appreciate any feedback on this code...
Thanks
Lillu