xsl-list
[Top] [All Lists]

RE: [xsl] Push Processing

2009-03-02 09:30:09
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(_dot_)vallone(_at_)verizon(_dot_)net] 
Sent: 02 March 2009 14:14
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>