xslt 3.0 参数未被覆盖检查

问题描述 投票:0回答:1

鉴于:

<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 中完成了此操作,这被认为是不好的做法吗?

xml parameter-passing xslt-3.0
1个回答
0
投票

如果您在

xsl:with-param
中将其声明为隧道参数,那么它将仅匹配在
tunnel="yes"
中用
xsl:param
声明的参数,反之亦然。

© www.soinside.com 2019 - 2024. All rights reserved.