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()), '~')"/>