RE: [xsl] Union of StepPattern

Subject: RE: [xsl] Union of StepPattern
From: "Michael Kay" <mhkay@xxxxxxxxxxxx>
Date: Fri, 16 Feb 2001 00:16:20 -0000
> I have a situation where I need to remove the DIVs from within an LI
> element. We have decided that when we encounter a DIV within
> an LI we are
> going to replace it with a training BR if the next valid
> sibling is another
> DIV. Otherwise we'll do nothing. Can I do the following:
>
> 	<xsl:template match="DIV[parent::LI]">

That's fine, though most people write match="LI/DIV" which means the same.

> 		<xsl:varible name="following-valid"
> select="following-sibling::DIV|following-sibling::P|following-
> sibling::OL|fo
> llowing-sibling::UL" />
> 		<xsl:apply-templates select="*|comment()|pi()|text()"/>
> 		<xsl:if test="$following-valid[1] =
> following-sibling::DIV[1]">
> 			<br />
> 		</xsl:if>
> 	</xsl:template>
>
> > Whether this works depends on whether the select in the
> variable returns
> > everything in document order

Technically the value of the variable is a unordered node-set, and the
filter expression $following-valid[1] selects the node in this node-set that
comes first in document order. So in effect, yes, you're OK.

But the "=" test is wrong: it compares the string-values of the nodes, not
their identity. To compare identity, use generate-id(X)=generate-id(Y), or
count(X|Y)=1. Except that in this case, I think you can simply say <xsl:if
test="$following-valid[1][self::DIV]">.

Mike Kay
>


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


Current Thread