Parsing for double elements through xsl

L

Linda

Hi,

Sorry if this is the wrong group I'm posting to. We are using a CMS
which saves all files as .xml. We have an xslt file where we parse
all html tags. At the moment, the CMS sometimes puts in < br / > <
br / > to separate content instead of placing text in < p > tags.

I'm trying to find any instance where a < br > follows a < br >,
however for some reason I'm not getting the syntax quite correct. I'm
just starting out with xsl, so it could be a silly mistake, but I
can't find out a solution.

We use xsl v 1.0. The code that I've tried is:

<xsl:template match="br">

<xsl:choose>
<xsl:when test="preceding-sibling::br[1]"></xsl:when>
<xsl:eek:therwise><xsl:copy-of select="."/></xsl:eek:therwise>
</xsl:choose>
</xsl:template>

I thought that the [1] is meant to get the immediately preceding
sibling. However it still finds instances where there is a single br.

Can someone help in regards to how to find an immediate preceding
sibling. An example of the code I'm using is:

Text< br />
Text< br />< br />
Text< br />< br />
Text< br />
Text.

It ignores the first < br > instance in the first line (as expected),
but it then finds the last single < br > instance in the 4th line.
Eventually I'm hoping to then move the text in < p > tags (using
preceding-sibling::text()[1]/ following-sibling::text()[1]), but for
the moment I just want to single out the double br.

Regards,
Linda
 
D

dnovatchev

<xsl:when test="preceding-sibling::br[1]"></xsl:when>

This would select the nearest preceding-sibling element named "br", if
such exists.

You want to test if the nearest preceding-sibling element has the name
"br", and this is essentially different:

Use:

preceding-sibling::*[1][self::br]


Hope this helped.


Cheers,
Dimitre Novatchev
 
L

Linda

Thanks for that, I gave that a try, however in the test, it is still
finding any br, not just the immediate br. Should I be putting this
test within a for-each? or should I be trying to find if the
preceding sibling is text instead?

<xsl:when test="preceding-sibling::br[1]"></xsl:when>

This would select the nearest preceding-sibling element named "br", if
such exists.

You want to test if the nearest preceding-sibling element has the name
"br", and this is essentially different:

Use:

preceding-sibling::*[1][self::br]

Hope this helped.

Cheers,
Dimitre Novatchev
 
P

Peter Flynn

<xsl:when test="preceding-sibling::br[1]"></xsl:when>

This would select the nearest preceding-sibling element named "br", if
such exists.

You want to test if the nearest preceding-sibling element has the name
"br", and this is essentially different:

Use:

preceding-sibling::*[1][self::br]

An alternative is preceding-sibling::*[1][local-name()='br']

However, when an XPath statement fails when expected to work (IMHE),
there is a namespace in effect somewhere :) Check...
I thought that the [1] is meant to get the immediately preceding
sibling.

Yes, but it's already qualified by the ::br, so your orginal statement
matched the closest preceding element called br (no matter how much
earlier it occurred among the siblings), not the immediately preceding
element. Testing for ::*[1] always finds the immediately preceding
element; you then test for the name.

///Peter
 
D

dnovatchev

Thanks for that, I gave that a try, however in the test, it is still
finding any br, not just the immediate br. Should I be putting this

Then it's highly likely you might have a default namespace defined and
in
scope.

Search for articles explaining this most FAQ for XPath expressions.

Cheers,
Dimitre Novatchev

(e-mail address removed)...
Thanks for that, I gave that a try, however in the test, it is still
finding any br, not just the immediate br. Should I be putting this
test within a for-each? or should I be trying to find if the
preceding sibling is text instead?

<xsl:when test="preceding-sibling::br[1]"></xsl:when>

This would select the nearest preceding-sibling element named "br", if
such exists.

You want to test if the nearest preceding-sibling element has the name
"br", and this is essentially different:

Use:

preceding-sibling::*[1][self::br]

Hope this helped.

Cheers,
Dimitre Novatchev
 
L

Linda

Thank you both for the explainations. I didn't think that it had been
defined elsewhere, but I'll let you know if I don't solve the
problem. I've at least got some good directions at what I can search
for now.

Linda
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,990
Messages
2,570,211
Members
46,796
Latest member
SteveBreed

Latest Threads

Top