Re: [xsl] testing for position of an element and displaying it accordingly

Subject: Re: [xsl] testing for position of an element and displaying it accordingly
From: ms <mina_hurray@xxxxxxxxx>
Date: Thu, 25 Jan 2007 09:40:45 -0800 (PST)
Hi all:

Thank you for all your input. I tried to implement all
the suggestions and concepts.

Here is waht I came up with:

My sample xml:


<r1>
<a><para>Some test</a></para>
<a><para>Some other test</a></para>
<text><para>This is level1</para></text>
<!--I can have any element here text, table -->
<a><para>Some test 3</a></para>
<r1>

My desired output:

Some test
Some other test
1. This is level1
Some test 3

Like I said before I was numbering r1..r10. So now fo
r1 template:

<xsl:template match="r1">
<xsl:call-template name="test">
<xsl:with-param name="format">1</xsl:with-param>
</xsl:call-template>
</xsl:template>

<xsl:template name="test">
<xsl:param name="format"/>
<xsl:if test="a">
<xsl:apply-templates select="a"/>
</xsl:if>
<fo:list-block space-before="6pt"
space-before.conditionality="retain">
<fo:list-item space-before="6pt">
<fo:list-item-label end-indent="label-end()">
<xsl:choose>
						<xsl:when test="$format = '1'">
							<fo:block>
							<fo:inline>
							<xsl:number format="1"/>.</fo:inline>
							</fo:block>
						</xsl:when>
						
</xsl:choose>
</fo:list-item-label>
<fo:list-item-body start-indent="body-start()"
end-indent="0pt">
<fo:block>
					<xsl:apply-templates select="*[not(self::a)]"/>
</fo:block>
</fo:list-item-body>
</fo:list-item>
</fo:list-block>

</xsl:template>

What happens here is, I check for 'a" before the
formatting, so if there is an <a> element it applies
templates. But since int he end I have said 
<xsl:apply-templates select="*[not(self::a)]"/>, it
does not match templates after the text, or table
elements. text and table are just examples and there
can be any element here.

So now I get

Some test
Some other test
Some test 3
1. This is level1

My question now is how do I match template if the <a>
element appears after a text element or any other
element. If I say, <xsl:apply-templates/> instead of
<xsl:apply-templates select="*[not(self::a)]"/>, then
I get:

Some test
Some other test
Some test 3
1. Some test
Some other test
Some test 3
This is level1

since it matches all templates then. This is tricky.
Can you please tell me how to resolve this issue?

--- David Carlisle <davidc@xxxxxxxxx> wrote:

> 
> you don't appear to have changed the code at all in
> response to teh
> previous comments.
> 
> 
> you have (as before)
> 
>     <xsl:template match="r1">
> <xsl:if test="child::a">
> <xsl:apply-templates select="a" mode="t"/>
> </xsl:if>
> 
> The xsl:if here soes nothing at all this is
> equivalent to
> 
>     <xsl:template match="r1">
> <xsl:apply-templates select="a" mode="t"/>
> 
> 
> and by specifying select="a" you are selecting all
> the a elements
> to be processed first, before any other elements.
> You do not want that,
> so select all children, not just a ones, then they
> will be processed in
> the natural order.
> 
> <xsl:template match="r1">
> <xsl:apply-templates/>
> </xsl:template>
> 
> then have templates for a and test that do the right
> thing
> 
> <xsl:template match="a">
> <fo:block><xsl:number/>:
> <xsl:apply-templates/></fo:block>
> </xsl:template>
> 
> <xsl:template match="text">
> <fo:block><xsl:apply-templates/></fo:block>
> </xsl:template>
> 
> which is exactly Michael's suggestion in the message
> that you quoted.
> 
> David
> 
> 



 
____________________________________________________________________________________
Get your own web address.  
Have a HUGE year through Yahoo! Small Business.
http://smallbusiness.yahoo.com/domains/?p=BESTDEAL

Current Thread