如果提取的元素中没有值,如何在fo:block中生成空格?

时间:2014-10-08 06:31:44

标签: xslt xsl-fo

我正在使用XSL-FO和FOP .95,每当我在xsl-fo中编写代码时,我必须使用此语句来生成空格:

<fo:block>
    <xsl:choose>
        <xsl:when test="normalize-space(Seller_Name)!=''">
            <xsl:value-of select="normalize-space(Seller_Name)"/>
        </xsl:when>
        <xsl:otherwise><xsl:text>&#160;</xsl:text></xsl:otherwise>
    </xsl:choose>
</fo:block>

我不想使用这些选择条件时生成空白空间来保存块崩溃。有什么功能或属性可以在这里使用?我尝试过换行处理和白色空间崩溃,但它没有用。请告知一些事情。

2 个答案:

答案 0 :(得分:1)

如果您对上述内容感到满意,为什么不对其进行模板化。这会减少对三行的调用:

<xsl:template name="blockwithblank">
    <xsl:param name="field"/>
    <fo:block>
      <xsl:choose>
          <xsl:when test="normalize-space($field)!=''">
              <xsl:value-of select="$field"/>
          </xsl:when>
       <xsl:otherwise><xsl:text>&#160;</xsl:text></xsl:otherwise>
      </xsl:choose>
    </fo:block>
 </xsl:template>

以上是整个样式表中的一次,然后每个调用只有三行:

  <xsl:call-template name="blockwithblank">
      <xsl:with-param name="field" select="Seller_Name"/>
  </xsl:call-template>

我不确定你每次通话可以缩短三行以上。

答案 1 :(得分:1)

使用两个模板:一个用于常规案例,另一个用于具有更高优先级的模板,用于空案例:

<xsl:template match="Seller_Name">
  <fo:block>
    <xsl:value-of select="normalize-space()"/>
  </fo:block>
</xsl:template>

<xsl:template match="Seller_Name[normalize-space() = '']" priority="5">
    <fo:block>&#160;</fo:block>
</xsl:template>

您的XSLT需要在适当的位置使用xsl:apply-templates,但它会使当前模板更短。

如果您使用多个元素执行此操作,则可以匹配每个模板中的多个元素并节省大量重复。