首页 > 解决方案 > XSLT 1.0 Kludge 清理

问题描述

我正在以反向字体(黑色背景,白色文本)打印一行,分布在收据胶带的宽度上(41 个字符)。我有功能代码,但我想知道是否有更好的方法来做到这一点:

这是我现有的代码:

<text lang="en" align="center" smooth="true" reverse="1"><xsl:value-of select="substring($spaces21, 1, (string-length($spaces21) - ((string-length(SavingsSegment) div 2) + string-length(SavingsSegment) mod 2)))"/>
  <xsl:value-of select="SavingsSegment"/><xsl:value-of select="substring($spaces21, 1, (string-length($spaces21) - ((string-length(SavingsSegment) div 2) + string-length(SavingsSegment) mod 2)))"/>
</text>

此代码生成此 XML:

 <text lang="en" align="center" smooth="true" reverse="1" xmlns="">             YOU SAVED $2.00             </text>

澄清:spaces21 是一个包含 21 个空格的文本字段,如果这还不是很明显的话。

无论我输入的值是多少(1,275,824.00 美元的效果与 2.00 美元一样好),xml 都会正确打印。

我的问题是,这是曾经做过 kludge 的 kludgiest kludge。有没有办法以更清洁的方式做到这一点?

谢谢!

标签: xmlxslt-1.0

解决方案


如果您正在使用libxsltXalan其他支持 EXSLT str:align()str:padding()扩展功能的处理器,那么您可以简单地执行以下操作:

<text>
    <xsl:value-of select="str:align(SavingsSegment, str:padding(41, ' '), 'center')"/>
</text> 

要在纯 XSLT 1.0 中做到这一点,我相信这会更优雅:

<xsl:variable name="spaces21" select="'                     '"/>
<xsl:variable name="pad" select="(41 - string-length(SavingsSegment)) div 2"/>
<text>
    <xsl:value-of select="substring($spaces21, 1, floor($pad))"/>
    <xsl:value-of select="SavingsSegment"/>
    <xsl:value-of select="substring($spaces21, 1, ceiling($pad))"/>
</text> 

推荐阅读