Я создаю таблицу стилей xsl-fo to 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 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>