鉴于:
<table>
<title>Inspection</title>
<tgroup/>
<tbody>
<row>
<entry>
<para>Blend well.</para>
</entry>
</row>
<row>
<entry>
<effect effrg="cde"/>
</entry>
</row>
<!-- this entry would be empty -->
<row>
<entry>
<effect effrg="cde"/>
</entry>
</row>
<row>
<entry>
<!-- first effect would create a block, second should be ignored -->
<effect effrg="abc"/>
<effect effrg="abc"/>
</entry>
</row>
</tbody>
</table>
我试图防止由空
fo:table-cell
引起的错误。当 <entry>
的唯一孩子是 <effect>
时,可能会发生这种情况。我想尽量减少无关的 fo:blocks
所以我想我可以使用参数作为标志:
<xsl:template match="entry/effect[not(*)]" priority="50">
<xsl:param name="need-block" as="xs:boolean" select="true()"/>
<xsl:variable name="preceding-effrg" as="xs:string?">
<xsl:call-template name="get-previous-effectivity"/>
</xsl:variable>
<xsl:variable name="effrg" as="xs:string?" select="normalize-space(@effrg)"/>
<xsl:choose>
<xsl:when test="$effrg ne $preceding-effrg">
<fo:block xsl:use-attribute-sets="effect">
<xsl:text>{$asterisks3} </xsl:text>
<xsl:apply-templates select="@effrg"/>
</fo:block>
<xsl:apply-templates>
<xsl:with-param name="need-block" as="xs:boolean" select="false()" tunnel="true"/>
</xsl:apply-templates>
</xsl:when>
<xsl:when test="$need-block="false()"/>
<!-- any other sibling elements will create a block -->
<xsl:when test="../*[local-name() ne 'effect']"/>
<xsl:when test="following-sibling::*"/>
<xsl:otherwise>
<fo:block/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="get-previous-effectivity">
<xsl:param name="pos" as="xs:integer" select="1" />
<xsl:value-of select="((preceding::effect[$pos] | preceding::effect/sbeff[$pos])/@effrg)[normalize-space(.) != ''][1]"/>
</xsl:template>
我无法通过传递另一个值来更改
$need-block
模板中 effect
的值。如果分配了默认值,它会保留该值,如果没有默认值,它将保持为空,即使我确认传入的参数是false()
。我尝试了隧道,关闭隧道,从父级传递它并从模板传递,其中 $need-block
默认为 false()
。当我单步执行代码时,它似乎忽略了$with-param
。我已经在 xslt 1.0 中完成了此操作,这被认为是不好的做法吗?
如果您在
xsl:with-param
中将其声明为隧道参数,那么它将仅匹配在 tunnel="yes"
中用 xsl:param
声明的参数,反之亦然。