Re: [xsl] 2 columns with special conditions

Subject: Re: [xsl] 2 columns with special conditions
From: George Cristian Bina <george@xxxxxxxxxxxxx>
Date: Fri, 04 May 2007 17:41:18 +0300
Just add a new column to my previous solution and count the mc elements that define a row:

<?xml version='1.0'?>
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:template match="steps">
<table border="1">
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="mc[@type='F']">
<tr>
<td><xsl:number count="mc[@type='F' or (@type='C' and not(preceding-sibling::*[1][@type='F']))]"/></td>
<td><xsl:value-of select="@name"/></td>
<td><xsl:value-of select="following-sibling::*[1][@type='C']/@name"/></td>
</tr>
</xsl:template>
<xsl:template match="mc[@type='C'][not(preceding-sibling::*[1][@type='F'])]">
<tr>
<td><xsl:number count="mc[@type='F' or (@type='C' and not(preceding-sibling::*[1][@type='F']))]"/></td>
<td></td>
<td><xsl:value-of select="@name"/></td>
</tr>
</xsl:template>
</xsl:transform>


Regards,
George
---------------------------------------------------------------------
George Cristian Bina - http://aboutxml.blogspot.com/
<oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger
http://www.oxygenxml.com


Sven Waibel wrote:
Hi all,

i got another problem. I want to have a numbering in each row:

What i want:

Index   TypeF  TypeC
1		 -		1
2 		2		3
3		4		5

But i don't know if it has 1,2 or 3... rows.

Possibilities:

F=type F
C = type C

1) number of F more than C
F	C
F	-
F	C

2) number of F equals C
-	C
-	C
F	-
F	-

3) number of C more than F
-	C
-	C
-	C
-	C

I'm using template below (extended with a cell for my numbering):

I hope that my explanation is not so confusing.

Thanks again
Sven

Bjorndahl, Brad schrieb:
Hi,

I take a direct (non-clever) approach. This works. . .

<?xml version='1.0'?>
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; >


 <xsl:output method="xml" indent="yes"/>
 <xsl:template match="/allsteps">
  <tables>
   <xsl:apply-templates />
  </tables>
 </xsl:template>

<xsl:template match="steps">
<table>
<xsl:for-each select="mc" >
<xsl:choose>
<xsl:when test="@type = 'F'" >
<row>
<col><xsl:value-of select="@name" /></col>
<xsl:choose>
<xsl:when test="following-sibling::mc" > <!-- Not at end -->
<xsl:choose>
<xsl:when test="following-sibling::mc[1]/@type eq 'C'" >
<col><xsl:value-of select="following-sibling::mc[1]/@name"
/></col>
</xsl:when>
<xsl:otherwise>
<col />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise> <!-- At end -->
<col/>
</xsl:otherwise>
</xsl:choose>
</row>
</xsl:when>

<xsl:when test="@type = 'C'" >
<xsl:choose>
<xsl:when test="preceding-sibling::mc" > <!-- Not at beginning
-->
<xsl:choose>
<xsl:when test="preceding-sibling::mc[1]/@type eq 'C'" >
<row>
<col />
<col><xsl:value-of select="@name" /></col>
</row>
</xsl:when>
</xsl:choose>
</xsl:when>
<xsl:otherwise><!-- At beginning -->
<row>
<col/>
<col><xsl:value-of select="@name" /></col>
</row>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</table>
</xsl:template>
</xsl:transform>


. . . on this data:
<allsteps>
  <steps>
    <mc name="1" type="F"/>
    <mc name="2" type="C"/>
    <mc name="3" type="F"/>
    <mc name="4" type="C"/>
    <mc name="5" type="F"/>
    <mc name="6" type="C"/>
  </steps>
  <steps>
    <mc name="1" type="C"/>
    <mc name="2" type="C"/>
    <mc name="3" type="F"/>
    <mc name="4" type="C"/>
    <mc name="5" type="F"/>
    <mc name="6" type="C"/>
  </steps>
  <steps>
    <mc name="1" type="F"/>
    <mc name="2" type="C"/>
    <mc name="3" type="F"/>
    <mc name="4" type="F"/>
    <mc name="5" type="F"/>
    <mc name="6" type="C"/>
  </steps>
  <steps>
    <mc name="1" type="F"/>
    <mc name="2" type="C"/>
    <mc name="3" type="F"/>
    <mc name="4" type="F"/>
    <mc name="5" type="F"/>
    <mc name="6" type="F"/>
  </steps>
  <steps>
    <mc name="1" type="C"/>
    <mc name="2" type="C"/>
    <mc name="3" type="C"/>
    <mc name="4" type="C"/>
    <mc name="5" type="C"/>
    <mc name="6" type="C"/>
  </steps>
</allsteps>

Brad Bjorndahl
Technical Publications
Thermo Fisher Scientific


-----Original Message-----
From: Sven Waibel [mailto:sven.waibel@xxxxxxxx] Sent: May 3, 2007 10:06 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: [xsl] 2 columns with special conditions


Hi,

i have a "little" problem.
I try to get a two column layout where all elements with type F live in
column one and elements with type C in column two. Special thing is that
you have watch the order. How can i achieve case 2 and 3?

Thanks in advance
Sven

xml:
case1:

<mc name="1" type="F"/>
<mc name="2" type="C"/>
<mc name="3" type="F"/>
<mc name="4" type="C"/>
<mc name="5" type="F"/>
<mc name="6" type="C"/>

=>
(first column always type F, second type C)

1	2
3	4
5	6

there is no problem, template works.


case2:


<mc name="1" type="C"/>
<mc name="2" type="C"/>
<mc name="3" type="F"/>
<mc name="4" type="C"/>
<mc name="5" type="F"/>
<mc name="6" type="C"/>

=>

-	1
-	2
3	4
5	6


case3:


<mc name="1" type="F"/>
<mc name="2" type="C"/>
<mc name="3" type="F"/>
<mc name="4" type="F"/>
<mc name="5" type="F"/>
<mc name="6" type="C"/>

=>

1	2
3	-
4	-
5	6

my xsl:
....
<xsl:template match="step">
	<xsl:for-each select="descendant::mc[position() mod 2 = 1]">
		<tr>
			<td>
				<xsl:value-of
select="self::node()[@type='F']/@name"/>
			</td>
			<td>
				<xsl:value-of
select="following-sibling::node()[position()+1 and @type='C']/@name"/>
			</td>
		</tr>
	</xsl:for-each>
</xsl:template>
...

--
===============================================================

Current Thread