Click to See Complete Forum and Search --> : tag escaping


Mr R
09-08-2003, 01:58 PM
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

Mr R
09-09-2003, 08:46 AM
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