RE: [xsl] Positional tests

Subject: RE: [xsl] Positional tests
From: "Paul Clarke" <pclarke@xxxxxxxxxxxxxxxx>
Date: Wed, 2 Mar 2005 19:26:23 -0000
Hi Wendell,

Thanks for your reply, I'm afraid I over-simplified things and I don't think
your suggestion will work.

Here's a true representation of my data. 

When processing font in block (3) or font in (4) I need to check back to see
if block(2) exists.

The structure is not the same in all cases as this XML originates from a
convertor.

<book>
  <Section1>
    <inline>
      <block>Anexo</block> (1)
    </inline>
    <Section2>
      <block>Abreviaturas</block> (2)
      <body>
        <table>
          <thead>
            <tr>
              <td>
                <p>
                  <block> (3)
                    <font font-weight="bold">Abbreviation</font>
                  </block>
                </p>
              </td>
              <td>
                <p>
                  <block> (4)
                    <font font-weight="bold">Description</font>
                  </block>
                </p>
              </td>
            </tr>
          </thead>
          <tbody>
            .
            .
            .
          </tbody>
        </table>
      </body>
    </Section2>
  </Section1>
</book> 

Thanks

Paul

-----Original Message-----
From: Wendell Piez [mailto:wapiez@xxxxxxxxxxxxxxxx] 
Sent: 02 March 2005 18:47
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] Positional tests

Hi Paul,

At 01:17 PM 3/2/2005, you wrote:
>I need to find out if a block element that I process is the first one 
>with respect to its ancester S1, S2 or S3 elements. The hierarchy looks 
>something like this:
>
>         <root>
>           <S1>
>             <block> <<
>             <S2>
>                 <block> <<
>                 <block>
>               <S3>
>                 <body>
>                   <block> <<
>                   <p>
>                 <block>
>                 </body>
>                 </S3>
>             </S2>
>           </S1>
>         </root>
>
>I have tried:
>
>         test=". = ancestor::S3//block[1] or . = ancestor::S2//block[1] or
.
>= ancestor::S1//block[1]"
>
>But this slows down processing enormously.

Yes, it'll be slow (it does some heavy-duty tree traversal) -- and it won't
work, either. You can't test node identity with the "=" operator: it
compares string values.

"not(preceding-sibling::block)" will return true if the current node has no
preceding sibling blocks. Is your requirement different from this, and if
so, how?

For example, when you have

<S3>
   <block/>
   <body>
     <block/>
   </body>
</S3>

both blocks here pass the test I offered. Should they? (The second is not
"first with respect to its S3 ancestor".) Is your data constrained such that
this isn't a problem?

Cheers,
Wendell


======================================================================
Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
   Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================

Current Thread