【问题标题】:xsl:fo don't split word into 2 linesxsl:fo 不要将单词分成 2 行
【发布时间】:2015-04-21 11:27:46
【问题描述】:

我想停止将生成的单词分成两行。现在我尝试使用 wrap-option="wrap" 但没有任何效果。 我希望有人可以帮助我;)

我使用 Saxon-HE,xslt 2.0

我的 xml 文件:

<root>
     <out>
          invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 
          <build>
               <name>John</name>
               <year>29</year>
               <address>London</address>
               <code>12345678902331234313123123123123123123</code>
          </build>At vero eos et    
     </out>
</root>

我的 xslt 文件:

 <xsl:template match="out">
        <fo:block>
               <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="build">
        <fo:inline wrap-option="wrap" color="Red">
            <xsl:value-of select="concat(./name,'-',./year,'-',./address,'+',./code)"/>
        </fo:inline>
    </xsl:template>

我的预期输出如下:

Invidunt ut labore et dolore magna aliquyam erat,sed diam voluptua
John-29-London+11231231231...

我的解决方案的输出:

Invidunt ut labore et dolore magna aliquyam erat,sed diam voluptua John-29
-London+123123..

【问题讨论】:

    标签: xml xslt xslt-2.0 xsl-fo


    【解决方案1】:

    如果这些是样式表中唯一的模板,则文本节点由内置模板处理。您不应该以这种不受控制的方式输出文本。如果添加与text() 匹配的空模板(如I have told you already),则build 中的文本将显示在一行中。

    XSLT 样式表

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
       xmlns:fo="http://www.w3.org/1999/XSL/Format">
        <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    
        <xsl:template match="/root">
          <fo:root>
            <fo:layout-master-set>
              <fo:simple-page-master master-name="page"
                page-height="297mm" page-width="210mm"
                margin-top="20mm" margin-bottom="10mm"
                margin-left="25mm" margin-right="25mm">
                <fo:region-body
                  margin-top="0mm" margin-bottom="15mm"
                  margin-left="0mm" margin-right="0mm"/>
                <fo:region-after extent="10mm"/>
              </fo:simple-page-master>
            </fo:layout-master-set>
            <fo:page-sequence master-reference="page">
              <fo:flow flow-name="xsl-region-body">
                <xsl:apply-templates/>
              </fo:flow>
            </fo:page-sequence>
            </fo:root>
        </xsl:template>
    
        <xsl:template match="out">
            <fo:block>
                   <xsl:apply-templates/>
            </fo:block>
        </xsl:template>
    
        <xsl:template match="build">
            <fo:inline wrap-option="wrap" color="Red">
                <xsl:value-of select="concat(name,'-',year,'-',address,'+',code)"/>
            </fo:inline>
        </xsl:template>
    
        <xsl:template match="text()"/>
    </xsl:transform>
    

    XSL-FO 输出

    <?xml version="1.0" encoding="UTF-8"?>
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
       <fo:layout-master-set>
          <fo:simple-page-master master-name="page"
                                 page-height="297mm"
                                 page-width="210mm"
                                 margin-top="20mm"
                                 margin-bottom="10mm"
                                 margin-left="25mm"
                                 margin-right="25mm">
             <fo:region-body margin-top="0mm"
                             margin-bottom="15mm"
                             margin-left="0mm"
                             margin-right="0mm"/>
             <fo:region-after extent="10mm"/>
          </fo:simple-page-master>
       </fo:layout-master-set>
       <fo:page-sequence master-reference="page">
          <fo:flow flow-name="xsl-region-body">
             <fo:block>
                <fo:inline wrap-option="wrap" color="Red">John-29-London+12345678902331234313123123123123123123</fo:inline>
             </fo:block>
          </fo:flow>
       </fo:page-sequence>
    </fo:root>
    

    渲染的 PDF 输出


    但真正的问题是,如果文本实际上比一行长,如何防止文本换行,例如如果输入看起来像

    <code>123456789023312343131231231248364387438463846837483643123123123</code>
    

    那么,一个合适的keep 实现你想要的:

    <xsl:template match="build">
        <fo:inline keep-together.within-line="always" color="Red">
            <xsl:value-of select="concat(./name,'-',./year,'-',./address,'+',./code)"/>
        </fo:inline>
    </xsl:template>
    

    然后一行文字刚好溢出页面边框

    最后是keep-together,但没有匹配text()的模板:

    【讨论】:

    • 使用 fo:block wrap 选项工作,但我的输出后有一个换行符
    • @Franz 很抱歉,但我真的不明白你的意思,你指的是我提出的解决方案,或者你在谈论的包装选项,或者什么“输出”完全正确。
    • 感谢它的 keep-together 属性 ;)
    猜你喜欢
    • 2015-06-05
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多