xsl-list
[Top] [All Lists]

Re: [xsl] suppressing only the last PI

2007-01-03 14:44:13
Thanks for your help.  I am trying to process all nodes, though, not 
just the PIs.  It looks as if I change this, it will only grab the PIs 
that are not specified, and not the other content.  Am I interpreting 
this correctly?


----- Original Message -----
From: Abel Braaksma <abel(_dot_)online(_at_)xs4all(_dot_)nl>
Date: Wednesday, January 3, 2007 3:23 pm
Subject: Re: [xsl] suppressing only the last PI
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com

Emily(_dot_)Garrett(_at_)thomson(_dot_)com wrote:
However, the following instruction occurs prior to the content and
should suppress only the last PI, but is suppressing all processing
instructions named TL_XSL and whose value beings with 'PageEnd_' 
and not
just the last one:

   <xsl:apply-templates
select="node()[not(self::processing-instruction('TL_XSL')[starts-
with(.,> 'PageEnd_')][position()=last()])]"/>
        
Can anyone tell what is wrong with it and why it is not just 
suppressing> the last one? 

Hi Emily,

Instead of not(), use position != last(). Like this:

node()[self::processing-instruction('TL_XSL')
[starts-with(.,'PageEnd_')]][position()!=last()]

Using the function not() returns true if the so-called effective 
boolean 
value of the argument returns false. In your case, the instruction 
inside the brackets is an xpath expression that always returns 
something 
when at a processing instruction. The reverse being false. This 
has to 
do with shifting the square brackets. This becomes apparent when 
dissecting your expression:

node()
  [not
     (
        self::processing-instruction('TL_XSL')
        [starts-with(., 'PageEnd_')]
        [position()=last()]
     )
  ]

Remove  not() and proc-instr() for clarity leaves:

1)      node()[[starts-with(., 'PageEnd_')]
2)      [position()=last()]]

Look closely at the square brackets. It says: "In the current 
node, select all that starts with PageEnd, and if so, select the 
last one you find". Effectively, you select a "group of one node 
and take its last node", which is always true (for nodes that 
start with PageEnd that is).

Reverse that, and it is always false.

If you want to use not(), you can do so, but put the brackets in 
the right position, and reverse only the part you want to reverse 
(namely, the test for last()):

node()
  [self::processing-instruction('TL_XSL')]
  [starts-with(., 'PageEnd_')]
  [not(position()=last())]

But I'd find it more readable using != instead of not(), but 
that's a matter of taste.

HtH,

Cheers,
-- Abel Braaksma
  http://www.nuntia.nl






--~----------------------------------------------------------------
--
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>