【发布时间】:2011-05-21 18:56:29
【问题描述】:
我正在创建一个 xsl-fo 到 rtf 样式表。我遇到的问题之一是将 xsl-fo 文档中的众多计量单位转换为缇(rtf 计量单位)。
一段特定的代码计算列的宽度:
<xsl:value-of select="sum(preceding-sibling:
:fo:table-column/@column-width) + @column-width"/>
...问题是/@column-width 的值可能是从1in(1 英寸)到20px(20 像素)的任何值,所以当我进行求和时它会失败。
我需要以某种方式将 @column-width 转换为 twip 等效项:
1pt = 19.95 twips, 1px = 15 twips, 1pc = 240 twips, 1in = 1440 twips, 1cm = 567 twips, 1mm = 56.7 twips, 1em = 240 twips
我可能可以编写一个可以进行转换的方法,但我相信有一些方法可以利用translate() 函数更有效地完成此操作。
请注意,我的 xsl 并不是那么好,因此我们将不胜感激提供如何实现此目标的示例
编辑
我设法找到了我想要的东西,但不知道如何从上述计算中调用此模板:
<xsl:template match="@*" mode="convert-to-twips">
<xsl:variable name="scaling-factor">
<xsl:choose>
<xsl:when test="contains (., 'pt')">19.95</xsl:when>
<xsl:when test="contains (., 'px')">15</xsl:when>
<xsl:when test="contains (., 'pc')">240</xsl:when>
<xsl:when test="contains (., 'in')">1440</xsl:when>
<xsl:when test="contains (., 'cm')">567</xsl:when>
<xsl:when test="contains (., 'mm')">56.7</xsl:when>
<xsl:when test="contains (., 'em')">240</xsl:when>
<!-- guess: 1em = 12pt -->
<xsl:otherwise>1</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="numeric-value"
select="translate (., '-0123456789.ptxcinme', '-0123456789.')"/>
<xsl:value-of select="$numeric-value * $scaling-factor"/>
</xsl:template>
【问题讨论】:
-
好问题,+1。请参阅我的答案以获得完整且简单的解决方案。
-
是的,这是一个完整的解决方案——不仅仅是伪代码。
-
我的回答只是一个示例,说明如何使用
xsl:call-template使用模板规则。您使用translate的方式也有一点错误。看看我的回答,希望对你有帮助。
标签: xslt