XSLT <xsl: value-of> генерирует дополнительные разрывы строк

В XSLT, используя, он генерирует разрыв строки перед отображаемым значением и еще один после него. Вот пример:

<xsl:when test="name(.) = 'Item'">
     "<xsl:value-of select="./Item/Data[last()]/text()"/>"
</xsl:when>

И полученный результат:


                                                   "
                                             09/07/2012
"

Как видите, он ставит два переноса строки до и после значения результата, в то время как желаемый результат:

"09/07/2012"

Исходный ввод:

Здесь идет оригинальный ввод, извините за это.

                                      <Item>
                                         <Item>
                                            <Data>105</Data>
                                            <Data>09/07/2012</Data>
                                         </Item>
                                      </Item>

Я выполняю этот XSLT в Oracle Server Bus

Любая помощь будет оценена.

4 ответа

Решение

Дополнительное пространство является также может исходить из выбранного текста. использование normalize-space() удалить это.

<xsl:value-of select="normalize-space(./Item/Data[last()]/text())"/>

Правильно использовать Overnuts <xsl:text> вокруг кавычек, в противном случае процессор Xslt сохранит новую строку до открытия / после заключительных кавычек. Тем не менее, я до сих пор не понимаю, почему новая строка может попасть между кавычками и вашим xsl:value-of?

Я пробовал следующее

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/xml" xml:space="default">
        <xsl:apply-templates select="*" />
    </xsl:template>

    <xsl:template match="*" xml:space="default">
        <xsl:choose>
            <xsl:when test="name(.) = 'Item'">
                <xsl:text>"</xsl:text>
                <xsl:value-of select="normalize-space(./Item/Data[last()]/text())"/>
                <xsl:text>"</xsl:text>
            </xsl:when>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>

При запуске с этим XML:

<xml>
    <Item>
        <Item>
            <Data>105</Data>
            <Data>09/07/2012</Data>
        </Item>
    </Item>
</xml>

Производит "09/07/2012"

Я думаю, что вы можете попробовать:

все в одной строке (быстро и грязно):

<xsl:when test="name(.) = 'Item'">"<xsl:value-of select="./Item/Data[last()]/text()"/>"</xsl:when>

или используйте теги, подобные этой (лучшая практика):

<xsl:when test="name(.) = 'Item'">
  <xsl:text>"</xsl:text>
    <xsl:value-of select="./Item/Data[last()]/text()"/>     
  <xsl:text>"</xsl:text>
</xsl:when>

Возможно, ошибка, связанная с реализацией?

Используя xsltproc, все вышеперечисленное работает, как и ожидалось, хотя ожидаемые результаты для новой строки + пробела + цитата + дата + цитата + новая строка + пробел также предназначены для копирования / external / white-space. Все остальные примеры дают те же 13 байтов, включая завершающий перевод строки.

Используя libxml 20706, libxslt 10124 и libexslt 813 xsltproc был скомпилирован с libxml 20701, libxslt 10124 и libexslt 813 libxslt 10124 скомпилирован с libxml 20701 libexslt 813 скомпилирован с libxml 20701

Возможно, оригинальный XML-источник содержит эти новые строки (отступ), попробуйте что-то вроде:

<xsl:value-of select="concat('~', normalize-space(./Item/Data[last()]/text()), '~')"/>
Другие вопросы по тегам