3

文の終わりに完全な単語を残したまま、長い文を複数の行に分割したいと思います。行の長さが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)) &gt; 1">
            <xsl:value-of select="concat(substring($return,1,$width - 1), '&#10;')"/>
            <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.
4

2 に答える 2

2

純粋なXSLTでコーディングしようとするのではなく、この目的のために拡張関数を使用したくなるでしょう。javax.xml.transform質問で、Java拡張機能をサポートするXalanをデフォルトで使用していると言います。Apache commons-lang 3.1は、必要なことを正確に実行するように見える静的メソッドWordUtils.wrapを提供します。そのライブラリをプロジェクトに追加すると、次のように拡張機能として呼び出すことができます。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
     xmlns:wu="xalan://org.apache.commons.lang3.text.WordUtils"
     exclude-result-prefixes="wu">

  <xsl:template match=".....">
     <xsl:value-of select="wu:wrap(stringToWrap, 40)" />
  </xsl:template>
</xsl:stylesheet>

要素からラップする値を取得している場合は、string関数を使用する必要がある場合があります。wu:wrap(string(someElement), 40)

于 2013-02-28T20:18:32.830 に答える
1

FXSLstr-split-to-linesのテンプレートを使用したソリューションは次のとおりです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:f="http://fxsl.sf.net/">
 <xsl:import href="strSplit-to-Lines.xsl"/>

 <xsl:output indent="yes" omit-xml-declaration="yes"/>

 <xsl:template match="/">
  <xsl:call-template name="str-split-to-lines">
    <xsl:with-param name="pStr" select="concat(/*, ' ')"/>
    <xsl:with-param name="pLineLength" select="40"/>
    <xsl:with-param name="pDelimiters" select="' &#9;&#10;&#13;'"/>
  </xsl:call-template>
 </xsl:template>
</xsl:stylesheet>

この変換が次のXMLドキュメントに適用される場合:

<t>    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.</t>

必要な正しい結果が生成されます。

Lorem. ipsum dolor$ sit ame, consectetur 
adipiscing elit? Aenean ut mi neque, sit 
amet tincidunt magna. Phasellus eleifend 
suscipit neque, at pretium enim 
facilisis non. Aenean a ornare eros. 

注意してください

このソリューションでは、単語間の区切り文字と見なされる(複数の値の)文字をパラメーターとして指定できます。

于 2013-03-01T04:02:51.710 に答える