2014-01-22 2 views
1

Я хочу, чтобы моя строка отображалась так, как она есть в pdf, которую я генерирую из XML с помощью XSLT XPATH. Мой XML содержит строки с некоторыми пробелами в них, но проблема заключается в том, что xslt автоматически обрезает эти строки. Я проверил его по этой ссылке W3SCHOOL Try it yourself. Всякий раз, когда я добавляю дополнительное пространство, он просто автоматически обрезается, что мне действительно не нужно в моем случае. Любая помощь будет оценена.Почему String обрезается в XSLT?

-------- Обновления ------------

Я попытался заменить все пробелы в строке с   и попытался отобразить его, но не XSLT с   как пространство. Он рассматривает это как часть строки. Я также попытался использовать рекурсию для замены специального символа в строке с пространством (я заменил пробелы символом в xml, теперь мой xml содержит этот символ, где мне нужны пробелы), но он говорит named template is not available о рекурсивном вызове.

<xsl:template 
name="add-spaces"> 
<!-- COMMENTS is string containing ~ where I need spaces --> 
    <xsl:param 
     name="text" 
    select="COMMENTS" /> 
     <xsl:if 
     test="$text != ''"> 
     <xsl:variable 
      name="letter" 
      select="substring($text, 1, 1)" /> 
     <xsl:when 
     test="$letter = '~'"> 
     <fo:inline> 
     <xsl:text>&#160;</xsl:text> 
     </fo:inline> 
    </xsl:when> 
    <xsl:otherwise> 
     <fo:inline> 
     <xsl:value-of 
      select="$letter" /> 
     </fo:inline> 
     </xsl:otherwise> 
     <xsl:call-template 
     name="add-spaces"> 
       <xsl:with-param 
     name="text" 
     select="substring-after($text, $letter)" /> 
     </xsl:call-template> 
</xsl:if> 
</xsl:template> 
+0

Укажите пример кода, в котором ваша строка обрезается, и объясните, какие инструменты вы используете (FOP?). – glmxndr

+0

XSLT и XPath не создают файлы PDF. Какой инструмент вы используете? В любом случае вам нужно добавить код XSLT. –

ответ

0

Чтобы решить эту проблему, я просто заменил все пространства с особым характером говорят ~ в строках XML, а затем в XSLT Я выше шаблон с только незначительными изменениями (с использованием if вместо when, что я не знаю, почему when не работал), и я закончил. Теперь в pdf все мои строки содержат пробелы, в которых они мне нужны. Может быть, ниже кода - любительский, но на время он работал для меня.

<xsl:template name="add-spaces"> 
    <xsl:param name="text" select="COMMENTS" /> 
    <xsl:if test="$text != ''"> 
     <xsl:variable name="letter" select="substring($text, 1, 1)" /> 
     <xsl:if test="$letter = '~'"> 
      <xsl:text>&#160;</xsl:text> 
     </xsl:if> 
     <xsl:if test="$letter != '~'"> 
      <fo:inline> 
       <xsl:value-of select="$letter" /> 
      </fo:inline> 
     </xsl:if> 
     <xsl:call-template name="add-spaces"> 
      <xsl:with-param name="text" 
       select="substring-after($text, $letter)" /> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 
    <!-- Above is template and its call where I displayed strings is--> 
<xsl:call-template 
name="add-spaces"> 
<xsl:with-param 
    name="text" 
    select="COMMENTS" /> 
</xsl:call-template> 
2

Вы генерируете HTML. Проблема HTML в том, что нормальные пространства обрезаны. Вы должны использовать &nbsp; для пробелов. Тем не менее, вы не можете использовать &nbsp; в вашем XML, не определяя его как единое целое, но вы можете использовать вместо &#160;:

<artist>Bob Dylan&#160;</artist> 

Или вы можете определить entitiy в вашем XML до корневого тега:

<!DOCTYPE cds[ 
<!ENTITY nbsp "&#160;"> 
]> 

, а затем использовать

<artist>Bob Dylan&nbsp;</artist> 

Однако, для меня это кажется, что таблица выглядит некрасиво, если у вас нет пробелов в начале и в конце. Однако решение этого не состоит в том, чтобы добавить пробелы, решение состоит в том, чтобы указать paddings и поля в вашем преобразовании, например.

<td style="padding:0 10 0 10"><xsl:value-of select="catalog/cd/title"/></td> 
+0

Я заменил '' (пробел) в моей строке ' ', мой xslt не воспринимает это как пространство, а часть строки. Например, строка 'Bob Dylan  ' отображается как 'Bob Dylan  ', а не 'Bob Dylan'. – aneela

+0

Есть ли способ, я могу прочитать каждый символ и изменить его в пространстве в xslt. Я говорю об итерации каждого символа в строке, а затем принимая решение о появлении специальных символов? Я попробовал рекурсию, но он говорит, что 'named template недоступен при рекурсивном вызове'. – aneela

Смежные вопросы