Re: [xsl] get immediat preceeding node, if it is a comment

Subject: Re: [xsl] get immediat preceeding node, if it is a comment
From: Joerg Heinicke <joerg.heinicke@xxxxxx>
Date: Mon, 07 Oct 2002 22:58:49 +0200
Hello John,

may say it's obviously? ;-)

> <xsl:if
> test="preceding-sibling::node()[normalize-space][1]/@aggrtype='bit'">
>   <xsl:value-of
> select="preceding-sibling::node()[normalize-space][1]/@aggrinfo"/>
> </xsl:if>

You have as first predicate normalize-space, what means that you are searching for a preceding-sibling node with an element <normalize-space/> as child. In my answer to the other question I wrote normalize-space(), what means a non-empty (not only whitespace characters) node.

Both won't work in your case, because all your <item/>s are empty nodes. What you need is

<xsl:value-of
select="preceding-sibling::*[1][@aggrtype = 'bit']/@aggrinfo"/>

You don't need the <xsl:if/> around, because <xsl:value-of/> returns nothing, if no such node is found.

Regards,

Joerg

Liao, John Teguh (John) wrote:
Hi list, the newbie needs help again ;)

I have something like this:

<table name='table1' etc. etc.>
  <item name='col1' aggrtype="bit" aggrinfo="bit1,bit2,bit3"/>
  <item name="bit1" etc. etc./>
  <item name="bit2" etc. etc./>
  <item name="bit3" etc. etc./>
</table>

When my context node is <item name="bit1" ... /> I want to print the
aggrinfo (actually the number of bit names in aggrinfo, but I think I know
how
to do that, now) if and only if the node before bit1 has aggrtype="bit".
I figured this has to do with using the post below, but when I tried it
it gave me nothing. Here's my xsl:

<xsl:if
test="preceding-sibling::node()[normalize-space][1]/@aggrtype='bit'">
  <xsl:value-of
select="preceding-sibling::node()[normalize-space][1]/@aggrinfo"/>
</xsl:if>

What did I do wrong?

thanks!

J.L.

-----Original Message-----
From: Joerg Heinicke [mailto:joerg.heinicke@xxxxxx]
Sent: Friday, October 04, 2002 7:57 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] get immediat preceeding node, if it is a comment




Andrew Welch wrote:


preceding-sibling::node()[normalize-space()][1][self::comment()]

This will select the first in a list of nodes that return true for
normalize-space() and self::comment().

No, that would be

preceding-sibling::node()[normalize-space()][self::comment()][1]

What you have,
preceding-sibling::node()[normalize-space()][1][self::comment()]

selects the first non-whitespace-text node if it is a comment.


Sure.  But aren't they both the same (they select the same node)? The
only difference would be the size of the lists the predicates create?
(feel free to point out the correct terminology here)


Definitely no.

<root>
   <!--   test     -->
   <test1>test</test1>
   <test2>test</test2>
   <!--   test     -->
   <test3>test</test3>
   <test4>test</test4>
</root>

with context test4:

preceding-sibling::node() gets all other test elements and the comments and the whitespace only text nodes.

preceding-sibling::node()[normalize-space()] gets all other test elements and the comments.

preceding-sibling::node()[normalize-space()][1] gets test3.

preceding-sibling::node()[normalize-space()][1][self::comment()] gets nothing, because test3 isn't a comment.

preceding-sibling::node()[normalize-space()][self::comment()] gets all
comments.

preceding-sibling::node()[normalize-space()][self::comment()][1] gets the comment infront of test3.

But the original poster asked for immediately preceding comments. So only
preceding-sibling::node()[normalize-space()][1][self::comment()] is correct - with the danger of empty elements.


Regards,

Joerg



XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list


Current Thread