RE: [xsl] Multiple elements condition

Subject: RE: [xsl] Multiple elements condition
From: "Maxine Pensyl-Johnson" <Maxine.Pensyl-Johnson@xxxxxxx>
Date: Mon, 27 Aug 2007 08:21:35 -0700
It's not outputting anything.

I tried changing it around (below), but all that gave me was the first
occurance of a para inside a note.


				<fo:block keep-together="always">
					<fo:block text-align="center"
font="bold 11pt arial" space-before="3mm" >NOTE</fo:block>
					<fo:block padding-left="30pt"
padding-right="30pt">
						<xsl:choose>
							<xsl:when
test="count(./para) > 1">

<fo:character character="&#x25A1;"/>&#x25A1; <xsl:value-of
select="para"/>
							</xsl:when>
							<xsl:otherwise>

<xsl:apply-templates/>
							</xsl:otherwise>
						</xsl:choose>
					</fo:block>
				</fo:block>


So if my xml file is

<note>
<para>1</para>
<para>2</para>
<para>3</para>
</note>


Outputs:

Note
1


-----Original Message-----
From: G. Ken Holman [mailto:gkholman@xxxxxxxxxxxxxxxxxxxx]
Sent: Monday, August 27, 2007 8:07 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] Multiple elements condition

At 2007-08-27 07:55 -0700, Maxine Pensyl-Johnson wrote:
>I've been trying to wrap my head around this problem and so far have
>only succeeded in creating a headache. I keep thinking I'm making it
>more difficult than it needs to be. Your help is very much appreciated.
>Thank you in advance.
>
>Max
>
>Saxon 6.5.5
>XPATH 1.0
>
>Problem: When there are two or more <para> tags inside of a <note> tag
>output the <para> tags as a bulleted list. (Why didn't the author use a
>bulleted list to begin with? I don't know).

Sure ... but what is the problem?  There are a number of aspects of
your XSLT and XSL-FO that should probably change based on what I
read, but I can't tell which issue to focus on (but I can guess).

When you say you have a problem, what is happening that you do not
want to happen?

>Example:
>                     <note>
>                         <para>Misc text.</para>
>                         <para>Misc text.</para>
>                         <para>Misc text.</para>
>                         <para>Misc text.</para>
>                     </note>
>
>Should transform to:
>
>*Misc text.
>*Misc text.
>*Misc text.
>*Misc text.
>
>XSL Code:
>
>         <xsl:template match="note">
>                 <fo:block keep-together="always">
>                         <fo:block text-align="center"  font="bold 11pt
>arial" space-before="3mm" >NOTE</fo:block>
>                         <fo:block padding-left="30pt"
>padding-right="30pt">

You should probably be using start-indent= and end-indent= instead of
padding because of the interaction with other blocks and the nature
of the background colour (though it may not matter in this particular
case, padding is not typically used for indentation).

>                                 <xsl:choose>
>                                         <xsl:when
test="count(note/para)
> > 1">

Here you are counting note/note/para because your current node is
note ... this is probably what your question is ... given that your
current node is note, you should only be counting the para children:
count(para).

>                                                 <fo:character
>character="&#x25A1;"/> <xsl:value-of select="para"/>

You needn't use fo:character above, and the space between the
character and the paragraph will be lost because it is in the
stylesheet white-space ... and given you are dealing with paragraphs
of information you are approaching this incorrectly.  You probably
need to remove the block you had and replace it with something along
the lines of:

   <xsl:for-each select="para">
     <fo:block start-indent="30pt" end-indent="30pt">
       <xsl:text>&#x25a1; </xsl:text>
       <xsl:apply-templates/>
     </fo:block>
   </xsl:for-each>

></xsl:when>
>                                         <xsl:otherwise>
>                                                 <xsl:apply-templates/>

This now needs to be wrapped in <fo:block> after you remove it from
after the note:

     <fo:block start-indent="30pt" end-indent="30pt">
       <xsl:apply-templates/>
     </fo:block>

But you really aren't clear which problem you are referring to, so
hopefully one of the above will help.

. . . . . . . . . . Ken

--
Upcoming public training: XSLT/XSL-FO Sep 10, UBL/code lists Oct 1
World-wide corporate, govt. & user group XML, XSL and UBL training
RSS feeds:     publicly-available developer resources and training
G. Ken Holman                 mailto:gkholman@xxxxxxxxxxxxxxxxxxxx
Crane Softwrights Ltd.          http://www.CraneSoftwrights.com/s/
Box 266, Kars, Ontario CANADA K0A-2E0    +1(613)489-0999 (F:-0995)
Male Cancer Awareness Jul'07  http://www.CraneSoftwrights.com/s/bc
Legal business disclaimers:  http://www.CraneSoftwrights.com/legal

Current Thread