Parsing for double elements through xsl

Discussion in 'XML' started by Linda, Mar 16, 2008.

  1. Linda

    Linda Guest

    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
    Linda, Mar 16, 2008
    #1
    1. Advertising

  2. Linda

    Guest

    > <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



    On Mar 16, 3:32 pm, Linda <> wrote:
    > 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
    , Mar 17, 2008
    #2
    1. Advertising

  3. Linda

    Linda Guest

    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?

    On Mar 17, 1:04 pm, wrote:
    > > <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
    >
    Linda, Mar 17, 2008
    #3
  4. Linda

    Peter Flynn Guest

    wrote:
    >> <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
    --
    XML FAQ: http://xml.silmaril.ie/
    Peter Flynn, Mar 17, 2008
    #4
  5. Linda

    Guest

    > 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

    "Linda" <> wrote in message
    news:993fdfa5-8024-4c51-96b9-
    ...
    > 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?
    >
    > On Mar 17, 1:04 pm, wrote:
    >> > <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
    >>
    , Mar 17, 2008
    #5
  6. Linda

    Linda Guest

    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

    >
    > 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.
    Linda, Mar 17, 2008
    #6
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Kevin Flood
    Replies:
    0
    Views:
    1,017
    Kevin Flood
    Sep 8, 2004
  2. Kevin Flood
    Replies:
    1
    Views:
    2,727
    Kevin Flood
    Sep 13, 2004
  3. Replies:
    1
    Views:
    3,595
    A. Bolmarcich
    May 27, 2005
  4. Rob Smegma
    Replies:
    1
    Views:
    1,808
    shaun
    Sep 26, 2005
  5. Sydex
    Replies:
    12
    Views:
    6,472
    Victor Bazarov
    Feb 17, 2005
Loading...

Share This Page