[xsl] Problem with grouping on elements that are not always present

Subject: [xsl] Problem with grouping on elements that are not always present
From: Dieter Schmerlaib <dschmerlaib@xxxxxxxxxxxxxxxx>
Date: Wed, 11 Aug 2010 17:27:21 +0930
I trying to do a two level group using keys and failing given the following
data. The first group is on <WorkArea> the second on  <Skill>.  See --Data
Start-- below
My problem is that I don't know how to deal with the fact that there is not
always a WorkArea or Skill element and I want to include all data even when
either or these elements don't exist.

I am trying to use the stylesheet below see --StyleSheet Start--

I am successful when a Skill element exists but not when it doesn't. In
addition if there is  WorkArea and no skill I do not see the row I want  ie
There should be an output in my data for all those Sheets without a WorkArea
or Skill and with a WorkArea if there is no skill. ie TransactionNo = (1,2,8)
do not show up

Thanks
--StyleSheet Start--
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
	<xsl:output method="html"/>
	<xsl:key name="WorkAreas"   match="Sheet/PlanningData"
use="concat(WorkArea,'None')" />
	<xsl:key name="Skills"   match="SkillRequirement"
use="concat(../WorkArea,'None',Skill,'None')" />

	<xsl:template match="CertificationSheets">
		<HTML>
			<HEAD><TITLE>TEST</TITLE></HEAD>
			<BODY>
			<xsl:apply-templates select="Sheet/PlanningData/SkillRequirement
[generate-id(.) =
						 generate-id(key('Skills',concat(../WorkArea,'None',Skill,'None'))[1])]
">
			</xsl:apply-templates>

			</BODY>
		</HTML>
	</xsl:template>
<xsl:template match="SkillRequirement">
   <P>Work Area: <xsl:value-of select="../WorkArea"/>	</P>
   <P>Skill: <xsl:value-of select="Skill"/>	</P>

	<P>
		<TABLE border="1">
			<TBODY>
				<TR>
					<TD>
						<B>Trn #</B>
					</TD>
					<TD>
						<B>Type</B>
					</TD>

				</TR>

					<xsl:for-each
select="key('Skills',concat(../WorkArea,'None',Skill,'None'))">
				<TR>
					<TD>
						<B><xsl:value-of select="../../Summary/WorkOrderInfo/TransactionNo"
/></B>
					</TD>
					<TD>
						<B>
							<xsl:value-of select="../../Detail/Task/Type" />
						</B>
					</TD>
				</TR>
				</xsl:for-each>
			</TBODY>
		</TABLE>
		</P>
</xsl:template>


</xsl:stylesheet>

--StyleSheet End--

--Data Start--

<?xml version="1.0" encoding="CP437"?>
<?xml-stylesheet type="text/xsl" href="task_summ_html.xsl"?>
<CertificationSheets>
	<Sheet>
		<Summary>
			<WorkOrderInfo>
				<TransactionNo>000001</TransactionNo>
			</WorkOrderInfo>
		</Summary>
		<Detail>
			<Task>
				<Type>SERV</Type>
			</Task>
		</Detail>
		<PlanningData>
			<WorkArea>EI&amp;R</WorkArea>
		</PlanningData>
	</Sheet>
	<Sheet>
		<Summary>
			<WorkOrderInfo>
				<TransactionNo>000002</TransactionNo>
			</WorkOrderInfo>
		</Summary>
		<Detail>
			<Task>
				<Type>INSP/FUNC</Type>
			</Task>
		</Detail>
		<PlanningData>
		</PlanningData>
	</Sheet>
	<Sheet>
		<Summary>
			<WorkOrderInfo>
				<TransactionNo>000003</TransactionNo>
			</WorkOrderInfo>
		</Summary>
		<Detail>
			<Task>
				<Type>OPTNL CK</Type>
			</Task>
		</Detail>
		<PlanningData>
			<WorkArea>EI&amp;R</WorkArea>
			<SkillRequirement>
				<Skill>ELEC/INST</Skill>
				<ManHours> 1.00</ManHours>
			</SkillRequirement>
		</PlanningData>
	</Sheet>
	<Sheet>
		<Summary>
			<WorkOrderInfo>
				<TransactionNo>000004</TransactionNo>
			</WorkOrderInfo>
		</Summary>
		<Detail>
			<Task>
				<Type>OPTNL CK</Type>
			</Task>
		</Detail>
		<PlanningData>
			<WorkArea>EI&amp;R</WorkArea>
			<SkillRequirement>
				<Skill>ELEC/INST</Skill>
				<ManHours> 1.00</ManHours>
			</SkillRequirement>
		</PlanningData>
	</Sheet>
	<Sheet>
		<Summary>
			<WorkOrderInfo>
				<TransactionNo>000005</TransactionNo>
			</WorkOrderInfo>
		</Summary>
		<Detail>
			<Task>
				<Type>OPTNL CK</Type>
			</Task>
		</Detail>
		<PlanningData>
			<WorkArea>CCC</WorkArea>
			<SkillRequirement>
				<Skill>AIRFRAME</Skill>
				<ManHours> 1.00</ManHours>
			</SkillRequirement>
		</PlanningData>
	</Sheet>
	<Sheet>
		<Summary>
			<WorkOrderInfo>
				<TransactionNo>000006</TransactionNo>
			</WorkOrderInfo>
		</Summary>
		<Detail>
			<Task>
				<Type>INSP</Type>
			</Task>
		</Detail>
		<PlanningData>
			<WorkArea>LH ENG</WorkArea>
			<SkillRequirement>
				<Skill>ELECTRICAL</Skill>
				<ManHours> 1.00</ManHours>
			</SkillRequirement>
			<SkillRequirement>
				<Skill>AIRFRAME</Skill>
				<ManHours> 1.00</ManHours>
			</SkillRequirement>
		</PlanningData>
	</Sheet>
	<Sheet>
		<Summary>
			<WorkOrderInfo>
				<TransactionNo>000007</TransactionNo>
			</WorkOrderInfo>
		</Summary>
		<Detail>
			<Task>
				<Type>INSP</Type>
			</Task>
		</Detail>
		<PlanningData>
			<WorkArea>LH ENG</WorkArea>
			<SkillRequirement>
				<Skill>ELECTRICAL</Skill>
				<ManHours> 1.00</ManHours>
			</SkillRequirement>
		</PlanningData>
	</Sheet>
	<Sheet>
		<Summary>
			<WorkOrderInfo>
				<TransactionNo>000008</TransactionNo>
			</WorkOrderInfo>
		</Summary>
		<Detail>
			<Task>
				<Type>INSP/FUNC</Type>
			</Task>
		</Detail>
		<PlanningData>
		</PlanningData>
	</Sheet>
	<Sheet>
		<Summary>
			<WorkOrderInfo>
				<TransactionNo>000009</TransactionNo>
			</WorkOrderInfo>
		</Summary>
		<Detail>
			<Task>
				<Type>INSP</Type>
			</Task>
		</Detail>
		<PlanningData>
			<SkillRequirement>
				<Skill>ELECTRICAL</Skill>
				<ManHours> 1.00</ManHours>
			</SkillRequirement>
			<SkillRequirement>
				<Skill>ENGINES</Skill>
				<ManHours> 1.00</ManHours>
			</SkillRequirement>
		</PlanningData>
	</Sheet>
</CertificationSheets>
--Data End-

Current Thread