最初の行が定義済みの長さを超えないように、単語を 2 行に分割する XSLT 2.0 変換を次に示します。
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pMaxLength" select="15"/>
<xsl:template match="ELEMENT">
<xsl:variable name="vWords" select="tokenize(@attribute, '\W+')"/>
<xsl:variable name="vNumWords" select="count($vWords)"/>
<xsl:variable name="vLastWordPos" select=
"for $k in 1 to vNumWords
return
if(string-length(string-join($vWords[position() le $k],
' ')
)
le $pMaxLength
and
string-length(string-join($vWords[position() le $k+1],
' ')
)
gt $pMaxLength
)
then $k
else ()
"/>
<xsl:variable name="vLastPos" select=
"($vLastWordPos, $vNumWords)[1]"/>
<span>
<p>
<xsl:value-of select=
"string-join($vWords[position() lt $vLastPos], ' '),
string-join($vWords[position() ge $vLastPos], ' ')
"
separator="
"/>
</p>
</span>
</xsl:template>
</xsl:stylesheet>
提供された XML ドキュメントに適用した場合:
<ELEMENT attribute="Value of the attribute">Some text</ELEMENT>
必要な正しい結果が生成されます。
<span>
<p>Value of the
attribute</p>
</span>
注意: 出力は HTML であるため、おそらく上記のコードでこれを置き換えたいと思うでしょう:
<span>
<p>
<xsl:value-of select=
"string-join($vWords[position() lt $vLastPos], ' ')"/>
<br />
<xsl:value-of select=
"string-join($vWords[position() ge $vLastPos], ' ')"/>
</p>
</span>