[Date Prev]
| [Thread Prev]
| [Thread Next]
| [Date Next]
--
[Date Index]
| [Thread Index]
Re: [xml-dev] Data into 3 even columns
- From: "Jesse Mandel" <jesse.mandel@gmail.com>
- To: xml-dev@lists.xml.org
- Date: Thu, 5 Apr 2007 11:40:40 -0700
Thanks, but I figured it out.
In case people are interested...what I meant was this:
In my example I have 12 items (both make and model nodes) and so three columns should be 4 each. I don' t want to break up a make node though so the actually output groups them into columns of 5, 4 and 3. Having 4 items in each column would cause the "accord" to in a different column then the rest of the hondas. Same with the tundra/toyotas. Is that more clear?
The solution I came up with is the following snippit. I am new to XML and XSLT so if anyone sees any potential problems or knows a better way (maybe without iterating through all the cars three times...) with this please let me know. It seems to work well though for me.
-Jesse
<xsl:variable name="total" select="count(./make) + count(./make/model)"/>
<div style="float: left; width:33%;">
<ul>
<xsl:for-each select="./make">
<xsl:if test="count(preceding-sibling::*)+count(preceding-sibling::*/model) < ($total div 3)">
<li class="make">
<xsl:value-of select="@name" />
</li>
<xsl:for-each select="./model">
<li class="model">
<xsl:value-of select="." />
</li>
</xsl:for-each>
</xsl:if>
</xsl:for-each>
</ul>
</div>
<div style="float: left; width:33%;">
<ul>
<xsl:for-each select="./make">
<xsl:if test="(count(preceding-sibling::*)+count(preceding-sibling::*/model) > ($total div 3)) and (count(preceding-sibling::*)+count(preceding-sibling::*/model) < ($total div 3)*2)">
<li class="make">
<xsl:value-of select="@name" />
</li>
<xsl:for-each select="./model">
<li class="model">
<xsl:value-of select="." />
</li>
</xsl:for-each>
</xsl:if>
</xsl:for-each>
</ul>
</div>
<div style="float: left; width:33%;">
<ul>
<xsl:for-each select="./make">
<xsl:if test="count(preceding-sibling::*)+count(preceding-sibling::*/model) > ($total div 3)*2">
<li class="make">
<xsl:value-of select="@name" />
</li>
<xsl:for-each select="./model">
<li class="model">
<xsl:value-of select="." />
</li>
</xsl:for-each>
</xsl:if>
</xsl:for-each>
</ul>
</div>
On 4/5/07, Nathan Young -X (natyoung - Artizen at Cisco) <natyoung@cisco.com> wrote:
Hi.
When you say "Ideally it wouldn't break the makes up" what does that
mean? I had to code a template where it would break a listing on
headers when the headers were within 5 list items of the midpoint, but
if the header was further than that from the midpoint then it would
break at the midpoint and add a continuation header to the top of the
second column.
I actually ended up doing the logic to find the break point in several
steps before starting the output run, then spitting out the column break
using d-o-e when I encountered the break point, although I know that
idea will make XSL idealists shudder.
I think in order to give a good answer one would need to know more about
your column breaking rules.
------------>Nathan
> I have an XML file with make and model car data (example at
> the end). It has an unknown number of makes and an unknown
> number of models per make. I want to use an XSLT doc to
> format it into 3 even columns. Ideally it wouldn't break the
> makes up but it counts both makes and models in the total
> count. See the desired output below.
>
> I am new to XML and have gotten the output to work except
> this part. I can get the count but I don't know how to break
> the data up evenly. Any ideas? Is it possible?
>
> <data>
>
> <make name="ford">
>
> <model>mustang</model>
>
> </make>
> <make name="honda">
>
> <model>civic</model>
> <model>accord</model>
>
> </make>
>
> <make name="toyota">
>
> <model>corolla</model>
> <model>rav4</model>
> <model>tundra</model>
>
> </make>
> <make name="hummer">
>
> <model>h1</model>
> <model>h2</model>
>
> </make>
> </data>
>
> ----------> to ----------->
>
> <div style="float: left">
> <ul>
> <li class="make">ford</li>
> <li class="model">mustang</li>
> <li class="make">honda</li>
> <li class="model">civic</li>
> <li class="model">accord</li>
> </ul>
> </div>
> <div style="float: left">
> <ul>
> <li class="make">toyota</li>
> <li class="model">corolla</li>
> <li class="model">rav4</li>
> <li class="model">tundra</li>
> </ul>
> </div>
> <div style="float: left">
> <ul>
> <li class="make">hummer</li>
> <li class="model">h1</li>
> <li class="model">h2</li>
> </ul>
> </div>
>
> --
> ____________________________
> jessem@cs.ucsb.edu
> B.S. Computer Science
> University of California Santa Barbara
>
--
____________________________
jessem@cs.ucsb.edu
B.S. Computer Science
University of California Santa Barbara
[Date Prev]
| [Thread Prev]
| [Thread Next]
| [Date Next]
--
[Date Index]
| [Thread Index]