XSLT 1.0 Очистка осадка - PullRequest
       11

XSLT 1.0 Очистка осадка

0 голосов
/ 02 февраля 2019

Я печатаю строку обратным шрифтом (черный фон, белый текст), растянутую по ширине чековой ленты (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>

Пояснение: пробел21 - это текстовое поле с 21 пробелом в нем, если это еще не было очевидно.

XML печатает правильно, независимо от того, какое значение я ввел (1 275 824,00 долл. Работали так же хорошокак $ 2.00).

Моя проблема в том, что это клуджестский клудж, который когда-либо делал клудж.Есть ли способ сделать это более чистым способом?

Спасибо!

1 Ответ

0 голосов
/ 02 февраля 2019

Если вы используете 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> 
...