I. 这是一个 XSLT 1.0 解决方案(XSLT 2.0 解决方案要容易得多):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vLine" select=
"concat('**********',
'**********',
'**********',
'**********',
'**********',
'**********',
'**********',
'**********'
)
"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:variable name="vsplitResult">
<xsl:call-template name="split">
<xsl:with-param name="pText" select="translate(., '
', '')"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="vnumLines" select=
"ceiling(string-length($vsplitResult) div 81)"/>
<xsl:choose>
<xsl:when test="$vnumLines > 11">
<xsl:value-of select="substring($vsplitResult, 1, 81*11 -1)"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="vremLines" select="11 - $vnumLines"/>
<xsl:value-of select="substring($vsplitResult, 1, 81*($vnumLines -1))"/>
<xsl:call-template name="padRight">
<xsl:with-param name="pText" select="substring($vsplitResult,81*($vnumLines -1)+1)"/>
</xsl:call-template>
<xsl:for-each select="(document('')//node())[not(position() > $vremLines)]">
<xsl:value-of select="concat('
', $vLine)"/>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
<xsl:template name="split">
<xsl:param name="pText" select="."/>
<xsl:param name="pLineLength" select="80"/>
<xsl:if test="$pText">
<xsl:value-of select="substring($pText, 1, $pLineLength)"/>
<xsl:if test="string-length($pText) > $pLineLength">
<xsl:text>
</xsl:text>
</xsl:if>
<xsl:call-template name="split">
<xsl:with-param name="pText" select="substring($pText, $pLineLength+1)"/>
<xsl:with-param name="pLineLength" select="$pLineLength"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="padRight">
<xsl:param name="pText"/>
<xsl:param name="pTotatLength" select="80"/>
<xsl:value-of select=
"concat($pText,
substring($vLine, 1, $pTotatLength - string-length($pText))
)"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于提供的 XML 文档时:
<Description>
text text text text text text text text text text text text text
text text text text text text text text text text text text text text text
text text text text </Description>
产生了想要的正确结果(我正在使用该*
字符以查看究竟生成了什么):
<Description>text text text text text text text text text text text text texttext text text t
ext text text text text text text text text text text texttext text text text **
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************</Description>
二、XSLT 2.0 解决方案:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pLineLength" select="80" as="xs:integer"/>
<xsl:param name="pTotalLines" select="11" as="xs:integer"/>
<xsl:param name="pPadChar" select="'*'" as="xs:string"/>
<xsl:variable name="vLine" as="xs:string" select=
"string-join(
(for $i in 1 to $pLineLength
return $pPadChar
),
''
)
"/>
<xsl:template match="/*">
<xsl:variable name="vText" select="translate(., '
', '')"/>
<xsl:copy>
<xsl:value-of separator="
" select=
"(for $numlines in string-length($vText) idiv $pLineLength +1,
$line in 1 to $numlines
return
if($line ne $numlines)
then substring($vText,
1 + ($line -1)*$pLineLength,
$pLineLength)
else
for $lastLine in substring($vText,
1 + ($line -1)*$pLineLength,
$pLineLength)
return
concat($lastLine,
substring($vLine,
1,
$pLineLength - string-length($lastLine))
),
(for $numlines in string-length($vText) idiv $pLineLength +1,
$rem in 1 to $pTotalLines - $numlines
return
$vLine)
)
"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当此转换应用于同一个 XML 文档(如上)时,会产生相同的正确结果:
<Description>text text text text text text text text text text text text texttext text text t
ext text text text text text text text text text text texttext text text text **
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************</Description>