gpt4 book ai didi

xslt - xsl 转换/翻译模板

转载 作者:行者123 更新时间:2023-12-02 11:41:21 25 4
gpt4 key购买 nike

我正在创建一个 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转换为缇等值:1pt = 19.95 缇,1px = 15 缇,1pc = 240 缇,1in = 1440 缇,1cm = 567 缇,1mm = 56.7 缇,1em = 240 缇

我也许可以编写一个可以进行转换的方法,但我相信有某种方法可以利用 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>

最佳答案

这种转变:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
xmlns:fo="some:fo" xmlns:my="my:my" >
<xsl:output method="text"/>

<my:units>
<unit name="pt">19.95</unit>
<unit name="in">1440</unit>
<unit name="cm">567</unit>
<unit name="mm">56.7</unit>
<unit name="em">240</unit>
<unit name="px">15</unit>
<unit name="pc">240</unit>
</my:units>

<xsl:variable name="vUnits" select=
"document('')/*/my:units/*"/>

<xsl:template match="/">
<xsl:apply-templates select="*/*/*/@column-width"/>
</xsl:template>

<xsl:template match="@column-width">
<xsl:variable name="vQuantity" select=
"substring(.,1, string-length() -2)"/>
<xsl:variable name="vUnit" select=
"substring(., string-length() -1)"/>

<xsl:variable name="vrtfAccumWidth">
<num>0</num>
<xsl:for-each select=
"../preceding-sibling::fo:table-column/@column-width">
<xsl:variable name="vQ" select=
"substring(.,1, string-length() -2)"/>
<xsl:variable name="vU" select=
"substring(., string-length() -1)"/>

<num>
<xsl:value-of select=
"$vQ * $vUnits[@name=$vU]"/>
</num>
</xsl:for-each>
</xsl:variable>

<xsl:value-of select=
"$vQuantity * $vUnits[@name=$vUnit]
+
sum(ext:node-set($vrtfAccumWidth)/num)
"/>

<xsl:text>&#xA;</xsl:text>
</xsl:template>
</xsl:stylesheet>

当应用于以下 XML 文档时(因为没有提供!):

<fo:fo xmlns:fo="some:fo">
<fo:table>
<fo:table-column column-width="2pt"/>
<fo:table-column column-width="2in"/>
<fo:table-column column-width="2cm"/>
<fo:table-column column-width="2mm"/>
<fo:table-column column-width="2em"/>
<fo:table-column column-width="2px"/>
<fo:table-column column-width="2pc"/>
</fo:table>
</fo:fo>

产生想要的正确结果:

39.9
2919.9
4053.9
4167.3
4647.3
4677.3
5157.3

注意:如果对于fo:table-column\@column-width的大序列需要更有效的解决方案,则 FXSL - scanl 可以使用模板/函数 - 请参阅我对您上一个问题的回答以获取完整的代码示例。

关于xslt - xsl 转换/翻译模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6083800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com