RE: [xsl] Push Processing

Subject: RE: [xsl] Push Processing
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Mon, 2 Mar 2009 14:29:33 -0000
Well, you can't apply templates to a node that isn't there, so you need to
find another way.

In XSLT 2.0 you could try this:

<xsl:function name="f:expand" as="element()">
  <xsl:param name="item" as="element(item)"/>
  <xsl:param name="child" as="element()?"/>
  <xsl:choose>
    <xsl:when test="exists($child)">
      <xsl:sequence select="$child"/>
    </xsl:when>
    <xsl:otherwise>
      <emptyCell/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:function>

then

<xsl:apply-templates select="f:expand(.,label), f:expand(.,code),
f:expand(.,no), ..."/>

Michael Kay
http://www.saxonica.com/

> -----Original Message-----
> From: Philip Vallone [mailto:philip.vallone@xxxxxxxxxxx] 
> Sent: 02 March 2009 14:14
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Push Processing
> 
> Hi List,
> 
> I am using push processing to output a resulting FO file. I 
> use apply-templates to build a table row and its cells. 
> Normally I would build the table by using a pull philosophy, 
> but it would require a lot of rework to the stylesheet. My 
> problem occurs when I have an optional element. Using 
> apply-templates, my output my leave out a cell, causing my 
> cell alignment to be off. The below is a dumb-down version 
> for example:
> 
> <item-entry>
> 	<item>
> 		<label>1</label>
> 		<code>234</code>
> 		<no>12345</no>
> 		<partno>12-3456-0981-1</partno>
> 		<name>Widget</name>
> 		<qty>3</qty>
> 	</item>
> </item-entry>
> 
> Suppose I am missing <nsn>, I need to apply an empty cell. 
> How can I do this using push processing?
> 
> 	<xsl:template match="item-entry">
> 		<xsl:apply-templates/>
> 	</xsl:template>
> 	<xsl:template match="item">
> 		<fo:table-row>
> 			<xsl:apply-templates/>
> 		</fo:table-row>
> 	</xsl:template>
> 	<xsl:template match="label">
> 		<fo:table-cell>
> 			<fo:block>
> 				<xsl:value-of select="."/>
> 			</fo:block>
> 		</fo:table-cell>
> 	</xsl:template>
> 	<xsl:template match="code">
> 		<fo:table-cell>
> 			<fo:block>
> 				<xsl:value-of select="."/>
> 			</fo:block>
> 		</fo:table-cell>
> 	</xsl:template>
> 	<xsl:template match="nsn">
> 		<fo:table-cell>
> 			<fo:block>
> 				<xsl:value-of select="."/>
> 			</fo:block>
> 		</fo:table-cell>
> 	</xsl:template>
> 	<xsl:template match="partno">
> 		<fo:table-cell>
> 			<fo:block>
> 				<xsl:value-of select="."/>
> 			</fo:block>
> 		</fo:table-cell>
> 	</xsl:template>
> 	<xsl:template match="name">
> 		<fo:table-cell>
> 			<fo:block>
> 				<xsl:value-of select="."/>
> 			</fo:block>
> 		</fo:table-cell>
> 	</xsl:template>
> 	<xsl:template match="qty">
> 		<fo:table-cell>
> 			<fo:block>
> 				<xsl:value-of select="."/>
> 			</fo:block>
> 		</fo:table-cell>
> 	</xsl:template>
> 
> Thanks,
> 
> Phil

Current Thread