【问题标题】:Force page count except last page强制页数,最后一页除外
【发布时间】:2018-04-13 12:29:30
【问题描述】:

也许这是一个简单的问题,希望有人可以帮助我。

目前,我使用我的 PDF 在奇数页上开始每一章。通过使用代码

<xsl: attribute-set name = "__ force__page__count"> 在我的 commons-attr.xsl 文件中

结果是我的 PDF 中总是有偶数页。

但是,如果我的 PDF 的页数为奇数,那么我现在如何才能知道此操作不会添加到最后一页 我认为像下面的代码那样做不会有帮助

<xsl:attribute-set name="__force__page__count">
        <xsl:attribute name="force-page-count">
            <xsl:choose>
               <xsl:when test="(position() = last())"> 
                    <xsl:value-of select="'no-force'"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="'even'"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:attribute>
    </xsl:attribute-set>

【问题讨论】:

  • &lt;xsl:when&gt;&lt;xsl:otherwise&gt; 条件都将even 的值分配给属性force-page-count。这是代码中的错字吗?
  • 这两个条件必须设置为“偶数”。我只是检查了它以确定我的情况。如果我将两者之一更改为“奇数”,空白页将消失。现在我必须找到诀窍,即当 PDF 的最后一页很好地填写时,我在它之后没有得到空白页。正如您在上面的代码中看到的那样,我希望使用“!=last()”来做到这一点。
  • 澄清一下:您希望所有页面序列都以偶数结尾,除了最后一个?
  • 感谢您的回复。 @Hebbes,几乎就在那里,所有页面序列都从奇数页开始,或者必须强制从奇数页开始。经过测试,这个结果很好,但现在我得到了一个(不需要的)空白页作为最后一页。而且我不需要那个空白页
  • 您能否添加您的 XML 结构的概述?如果结构与我预期的不同,那么 position() 测试将不起作用。

标签: pdf xslt xsl-fo


【解决方案1】:

我怀疑你的问题是从&lt;xsl:when test="name(/*) = 'bookmap' != last()"&gt; 开始的。您正在测试节点的名称是否不等于 last()。 你需要类似&lt;xsl:when test="(position() != last()) and (name(/*) = 'bookmap')"&gt;

或者position() != last() 可能就足够了,我希望这个属性集只在章节/页面序列的开头被调用,所以你的bookmap 测试可能没有必要。我不熟悉您使用的框架。

当然,这是否有效,取决于 XML 的结构。如果您的 XML 每一章都有一个节点,并且在处理这一章节点时调用了属性集,那么它应该可以工作。

如果属性集是从其他地方调用的,或者结构不同,则 position() 测试不会给出预期的结果。

并且您当前有一个测试尝试匹配除最后一章之外的每一章,因此如果测试有效,则只会为最后一章调用您的“否则”。构建xsl:choose 的更好方法是将异常放在 xsl:when 语句中:

<xsl:when test="position() = last()"> -match only the last chapter here-
    <xsl:value-of select="'no-force'"/>

对于xsl:otherwise

<xsl:value-of select="'even'"/>

在 XSL-FO 中,页数由 force-page-count 属性控制。可能的值之一是no-force,这具有您想要的效果:不添加任何页面。
值 'odd' 强制页面序列具有奇数页(并将添加空页来实现这一点)。

【讨论】:

  • 在用“no-force”测试它之后,所有的空白页都消失了,这不是我需要的。但感谢分享
  • 如果您仅将 otherwise 条件更改为 no-force 并且所有页面序列都更改了,则表明 xsl:when 测试不起作用。
  • 说得对。我在代码中犯了一个错误,现在它又好了。只有otherwise 是没有强制不工作的。
  • 您的 anwser 正在帮助我。到目前为止,它没有给出任何结果。我必须以此为基础做一些测试当前代码&lt;xsl:attribute-set name="__force__page__count"&gt; &lt;xsl:attribute name="force-page-count"&gt; &lt;xsl:choose&gt; &lt;xsl:when test="(position() = last())"&gt; &lt;xsl:value-of select="'no-force'"/&gt; &lt;/xsl:when&gt; &lt;xsl:otherwise&gt; &lt;xsl:value-of select="'even'"/&gt; &lt;/xsl:otherwise&gt; &lt;/xsl:choose&gt; &lt;/xsl:attribute&gt; &lt;/xsl:attribute-set&gt;
【解决方案2】:

忘记force-page-count,而是使用initial-page-number="auto-odd"。见https://www.w3.org/TR/xsl11/#initial-page-number

当您省略force-page-count 时,其默认值autoinitial-page-number 配合得很好。见https://www.w3.org/TR/xsl11/#force-page-count

【讨论】:

    【解决方案3】:

    大家好,我们做了几次测试,结果出来了。特此代码

    <xsl:attribute-set name="__force__page__count">
            <xsl:attribute name="force-page-count">
                <xsl:choose>
                    <xsl:when test="following-sibling::*[(contains(@class, 'topic/topic'))] and not(ancestor::*[contains(@class,' topic/topic ')])">
                <!--   <xsl:when test="$mirror-page-margins">-->
                        <xsl:value-of select="'end-on-even'"/>
                    </xsl:when>
                     <xsl:when test="not(following-sibling::*[(contains(@class, 'topic/topic'))])">                    
                        <xsl:value-of select="'auto'"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="'auto'"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:attribute>
        </xsl:attribute-set>
    

    感谢大家分享您的智慧。

    【讨论】:

      猜你喜欢
      • 2019-10-05
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      相关资源
      最近更新 更多