XSLT XML-HTML Transformation using grouping

K

Kevin Brown

Is there anyway to generate this type of resulting HTML table from
this XML using XSLT? Basically I need to be able to consult 2 trees of
data to generate the HTML, but I have not been able to figure out how
to do so. There is supposed to be a way of using templates and the key
function to do grouping, but can it be done with 2 different trees? If
so, are there any examples of such things

Thanks for any help,

Kevin

***

HTML Table

chef 1 chef 2 chef 3
must: make.pizza
pour.milk
maybe: make.orange.juice make.ice.cream make.martini
never: make.apple.pie


***

XML File
<?xml version="1.0" encoding="LATIN1" standalone="yes" ?>
<!--
<!DOCTYPE housework.definition PUBLIC "house work xml"
"housework.dtd">

-->
<housework.definition housework.name="kitchen work"
docclass.name="house work">
<element.for.housework.def.list>
<element.for.housework.def element.name="make.pizza" presence="must"
/>
<element.for.housework.def element.name="pour.milk" presence="must"
/>
<element.for.housework.def element.name="make.orange.juice"
presence="maybe" />
<element.for.housework.def element.name="make.apple.pie"
presence="never" />
<element.for.housework.def element.name="make.ice.cream"
presence="maybe" />
<element.for.housework.def element.name="make.martini"
presence="maybe" />
</element.for.housework.def.list>
<sequence.def.list>
<sequence.def sequence="stage 1">
<sequence.def.role role="chef 1">
<element.for.sequence.def.role element="make.pizza" />
<element.for.sequence.def.role element="pour.milk" />
<element.for.sequence.def.role element="make.orange.juice" />
</sequence.def.role>
<sequence.def.role role="chef 2">
<element.for.sequence.def.role element="make.apple.pie" />
<element.for.sequence.def.role element="make.ice.cream" />
</sequence.def.role>
<sequence.def.role role="chef 3">
<element.for.sequence.def.role element="make.martini" />
</sequence.def.role>
</sequence.def>
</sequence.def.list>
</housework.definition>
 
M

Marrow

Hi Kevin,

The only distinct/grouping I can see if the values of @presence?

Try something like...

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:eek:utput method="html" indent="yes"/>
<xsl:key name="kDistinctPresence" match="element.for.housework.def"
use="@presence"/>

<xsl:template match="/">
<html>
<body>
<xsl:variable name="chefs"
select="/housework.definition/sequence.def.list/sequence.def/sequence.def.ro
le"/>
<table border="1">
<!-- do the chef header row -->
<tr>
<th/>
<xsl:for-each select="$chefs">
<th>
<xsl:value-of select="@role"/>
</th>
</xsl:for-each>
</tr>
<!-- now do the rows for each distinct @presence -->
<xsl:apply-templates
select="/housework.definition/element.for.housework.def.list/element.for.hou
sework.def[generate-id() =
generate-id(key('kDistinctPresence',@presence))]">
<xsl:with-param name="chefs" select="$chefs"/>
</xsl:apply-templates>
</table>
</body>
</html>
</xsl:template>

<xsl:template match="element.for.housework.def">
<xsl:param name="chefs"/>
<xsl:variable name="this-presence"
select="key('kDistinctPresence',@presence)/@element.name"/>
<tr>
<th align="right">
<xsl:value-of select="@presence"/>
<xsl:text>:</xsl:text>
</th>
<!-- now do columns for each chef with this @presence value -->
<xsl:for-each select="$chefs">
<td>
<!-- look for matches withing this chef of the current @presence -->
<xsl:for-each select="element.for.sequence.def.role/@element[. =
$this-presence]">
<xsl:value-of select="."/>
<xsl:if test="position() != last()">
<br/>
</xsl:if>
</xsl:for-each>
</td>
</xsl:for-each>
</tr>
</xsl:template>
</xsl:stylesheet>


HTH
Marrow
http://www.marrowsoft.com - home of Xselerator (XSLT IDE and debugger)
http://www.topxml.com/Xselerator
 
W

William Park

Kevin Brown said:
Is there anyway to generate this type of resulting HTML table from
this XML using XSLT? Basically I need to be able to consult 2 trees of
data to generate the HTML, but I have not been able to figure out how
to do so. There is supposed to be a way of using templates and the key
function to do grouping, but can it be done with 2 different trees? If
so, are there any examples of such things

Thanks for any help,

Kevin

***

HTML Table

chef 1 chef 2 chef 3
must: make.pizza
pour.milk
maybe: make.orange.juice make.ice.cream make.martini
never: make.apple.pie

Why don't you convert your XML into arrays, ie.
must=( make.pizza pour.milk )
maybe=( make.orange.juice make.ice.cream make.martini )
never=( make.apple.pie )
and
chef1=( make.pizza pour.milk make.orange.juice )
chef2=( make.ice.cream make.apple.pie )
chef3=( make.martini )

Then, you can cross-check as you print them out.
 
K

Kevin Brown

Thanks guys, you've been a big help!

William Park said:
Why don't you convert your XML into arrays, ie.
must=( make.pizza pour.milk )
maybe=( make.orange.juice make.ice.cream make.martini )
never=( make.apple.pie )
and
chef1=( make.pizza pour.milk make.orange.juice )
chef2=( make.ice.cream make.apple.pie )
chef3=( make.martini )

Then, you can cross-check as you print them out.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top