【发布时间】:2013-02-28 19:18:55
【问题描述】:
我想将一个长句子分成多行,同时将整个单词保留在句子的末尾。我的行长为 40,所以它应该打印当前单词,然后如果它将行长度推到 40 以上,则继续下一行。所有定界符都是空格,我目前没有将单词作为标记检索。这似乎非常困难,因为我仅限于使用 XSLT 1.0。
示例来自:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ut mi neque, sit amet tincidunt magna. Phasellus eleifend suscipit neque, at pretium enim facilisis non. Aenean a ornare eros.
所需示例:
Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Aenean ut mi neque, sit
amet tincidunt magna. Phasellus eleifend
suscipit neque, at pretium enim facilisis
non. Aenean a ornare eros.
目前我正在使用现有的 XSL 方法:
<xsl:template name="nextline">
<xsl:param name="return"/>
<xsl:param name="width"/>
<xsl:choose>
<!-- when the string-length is greater than the width -->
<xsl:when test="(string-length($return) div string-length($width)) > 1">
<xsl:value-of select="concat(substring($return,1,$width - 1), ' ')"/>
<xsl:call-template name="nextline">
<xsl:with-param name="return" select="substring($return, $width)"/>
<xsl:with-param name="width" select="$width"/>
</xsl:call-template>
</xsl:when>
<!-- just print the string length -->
<xsl:otherwise>
<xsl:value-of select="substring($return,1,$width - 1)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
当前的、不受欢迎的示例:
Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Aenean ut mi neque, s
it amet tincidunt magna. Phasellus elei
fend suscipit neque, at pretium enim fa
cilisis non. Aenean a ornare eros.
以下部分解决方案导致:
Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Aenean ut mi neque, sit
amet tincidunt magna. Phasellus eleifend
suscipit neque, at pretium enim facilisis
non. Aenean a ornare eros.
【问题讨论】:
-
我非常想为此使用扩展函数,而不是尝试在纯 XSLT 中对其进行编码。鉴于您已经标记了问题“jaxb”,我可以假设您正在从 Java 运行转换吗?您将使用哪种 XSLT 处理器?几乎可以肯定做到这一点,但考虑到 WordUtils.wrap (commons-lang) 之类的东西的存在,似乎收获甚微......
-
不幸的是,并非我需要转换的所有文本都在 Java 变量中。为您提供更多上下文 - JAXB 用于将对象编组为 XML 文件,并执行 XSL 转换以创建报告。在这份报告中,有一些简短的变量名称和字符串来补充我需要转换的数据。编组的对象可能仅包含“2.0”和“28/02/2013”,而转换可能需要“周末总计:2.0 on 28/02/2013”。除了 javax.xml.transform 之外,我不确定我使用的是什么 Java 处理器 - 我希望这能提供更多的见解。