On Sat, Nov 09, 2002 at 12:22:20AM -0600, David Cramer wrote:
> I added the code below to my customization layer to control the keeps and breaks for
>figures, informalfigures, and screenshots in paras. Now when I have:
>
> <para> Blah <xref linkend="foo"/>.
> <informalfigure>...</informalfigure>
> </para>
>
> common.xsl complains "Error: no ID for constraint linkend: foo", even though foo is
>there and the document processes fine otherwise. Looking at the xsl, a <xsl:variable
>name="targets" select="key('id',$linkend)"/> (with a corresponding <xsl:key name="id"
>match="*" use="@id"/> elsewhere) is used to determine check to see if the linkend has
>a corresponding id, but that should be fine, right? This isn't a big deal, our
>processing system validates during the build and that catches real errors, so I can
>just comment out the message, but I was curious about where I'd gone wrong :-)
>
> Thanks,
> David
>
> <xsl:template match="para[informalfigure or figure or screenshot]">
> <fo:block xsl:use-attribute-sets="normal.para.spacing">
> <xsl:call-template name="anchor"/>
> <xsl:call-template name="para.figure">
> <xsl:with-param name="current.nodeset">
> <xsl:copy-of select="./* | ./text() | ./processing-instruction() |
>./comment()"/>
> </xsl:with-param>
> </xsl:call-template>
> </fo:block>
> </xsl:template>
>
> <xsl:template name="para.figure">
>
> <xsl:param name="current.nodeset"/>
>
> <xsl:variable name="before.figure">
> <xsl:for-each select="node()">
> <xsl:if test="
> not(self::informalfigure) and
> not(self::figure) and
> not(self::screenshot) and
> not(preceding-sibling::informalfigure) and
> not(preceding-sibling::figure) and
> not(preceding-sibling::screenshot)">
> <xsl:copy-of select="current()"/>
> </xsl:if>
> </xsl:for-each>
> </xsl:variable>
>
> <xsl:variable name="rest">
> <xsl:for-each select="$current.nodeset/node()">
> <xsl:if test="preceding-sibling::informalfigure or
> preceding-sibling::figure or preceding-sibling::screenshot">
> <xsl:copy-of select="current()"/>
> </xsl:if>
> </xsl:for-each>
> </xsl:variable>
>
> <fo:block><!-- before.figure -->
> <xsl:apply-templates select="$before.figure/node()"/>
> </fo:block>
> <xsl:if test="
> $current.nodeset/informalfigure or
> $current.nodeset/figure or
> $current.nodeset/screenshot">
> <fo:block
> keep-with-previous.within-column="always"
> keep-together.within-column="always"
> xsl:use-attribute-sets="normal.para.spacing">
> <xsl:apply-templates select="$current.nodeset/informalfigure[
> not(preceding-sibling::figure) and
> not(preceding-sibling::informalfigure) and
> not(preceding-sibling::screenshot)]"/>
> <xsl:apply-templates select="$current.nodeset/figure[
> not(preceding-sibling::figure) and
> not(preceding-sibling::informalfigure) and
> not(preceding-sibling::screenshot)]"/>
> <xsl:apply-templates select="$current.nodeset/screenshot[
> not(preceding-sibling::figure) and
> not(preceding-sibling::informalfigure) and
> not(preceding-sibling::screenshot)]"/>
> </fo:block>
> </xsl:if>
>
> <xsl:if test="normalize-space($rest) != ''">
> <xsl:call-template name="para.figure">
> <xsl:with-param name="current.nodeset" select="$rest"/>
> </xsl:call-template>
> </xsl:if>
>
> </xsl:template>
I'm curious about which processor you use with this.
When I use Saxon 6.5.2 with your code, I get this error:
"Error at xsl:for-each on line 40 of customfo.xsl:
To use a result tree fragment in a path expression, either
use exslt:node-set() or specify version='1.1'"
I get a similar error in xsltproc when I use the -v option.
The line in question is:
<xsl:for-each select="$current.nodeset/node()">
Since $current.nodeset is created with a xsl:copy-of, it
is a result tree fragment. How come your processor doesn't
stumble on this?
--
Bob Stayton 400 Encinal Street
Publications Architect Santa Cruz, CA 95060
Technical Publications voice: (831) 427-7796
Caldera International, Inc. fax: (831) 429-1887
email: [EMAIL PROTECTED]