xml - 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。有没有办法以更清洁的方式做到这一点?
谢谢!
解决方案
如果您正在使用libxslt
或Xalan
其他支持 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>
推荐阅读
- sonarqube - 在使用 SonarQube 期间从我的计算机执行扫描仪时出错
- javascript - Artyom.js 语音上的音频可视化器
- probability - 用代码建模任何概率分布
- javascript - iOS (14.01) 中 Chrome (90.0) 中的事件链不正确
- html - 自定义 Bootstrap Sass 组件
- c++ - 强制 g++/clang++ 使用本地 `libstdc++.so`
- xml - 如何遍历保存的 xml 文件来解析地址?
- python - 将 PubMed 的作者和隶属关系与 Python 匹配
- spring-cloud-config - 在 Spring Cloud 配置服务器中使用不记名令牌设置 bitbucket 访问
- vue.js - 来自 chokidar (D:\) 的错误:错误:EBUSY:资源繁忙或锁定,lstat 'D:\pagefile.sys'