@bik

XSL трансформация -> CSV -> как заменить знак новой строки?

День добрый!

Есть расширение, которое конвертирует данные из XML в CSV.
В полях "S_Street" и "R_Street" присутствуют данные в несколько строк, что конечно ломает формат CSV.

Подскажите пож. как заменить знак новой строки в полях "S_Street" и "R_Street" на пропуск с запятой (" ,").

Спасибо.

Здесь не получается вставить сам код, так как формат сообщения ломается. ССылка: https://drive.google.com/file/d/0B8P7x0eHO8zNNmtuS...
  • Вопрос задан
  • 206 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Roman-Fov
Без регулярок примерно так:
<documentRecipientAddressData>
      <street>Centroallee 1000
Einfahrt Parkhaus 7 an der "Alten Waltz" gegenüber Tryp Hotel ...</street>
      <street>Centroallee
1000
Einfahrt
Parkhaus 7 an der
"Alten Waltz" gegenüber Tryp Hotel ...</street>
      <street>Centroallee 1000 Einfahrt Parkhaus 7 an der "Alten Waltz" gegenüber Tryp Hotel ...</street>
</documentRecipientAddressData>


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:template match="/documentRecipientAddressData/street">
		<xsl:variable name="street">
			<xsl:call-template name="replace-line-breaks">
				<xsl:with-param name="text">
					<xsl:call-template name="normalize-line-breaks">
						<xsl:with-param name="text" select="."/>
					</xsl:call-template>
				</xsl:with-param>
			</xsl:call-template>
		</xsl:variable>
		<xsl:value-of select="normalize-space($street)"/>
		<xsl:text>&#xa;</xsl:text>
		<xsl:variable name="street">
			<xsl:call-template name="normalize-line-breaks">
				<xsl:with-param name="text" select="."/>
			</xsl:call-template>
		</xsl:variable>
		<xsl:value-of select="replace($street, '\n', ', ')"/>
		<xsl:text>&#xa;&#xa;</xsl:text>
	</xsl:template>

	<xsl:template name="replace-line-breaks">
		<xsl:param name="text"/>

		<xsl:choose>
			<xsl:when test="not(contains($text, '&#xa;'))">
				<xsl:value-of select="$text"/>
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="substring-before($text, '&#xa;')"/>
				<xsl:text>,&#160;</xsl:text>
				<xsl:call-template name="replace-line-breaks">
					<xsl:with-param name="text" select="substring-after($text, '&#xa;')"/>
				</xsl:call-template>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

	<xsl:template name="normalize-line-breaks">
		<xsl:param name="text"/>

		<xsl:choose>
			<xsl:when test="not(contains($text, '&#xa;&#xa;'))">
				<xsl:value-of select="$text"/>
			</xsl:when>
			<xsl:otherwise>
				<xsl:variable name="text">
					<xsl:value-of select="substring-before($text, '&#xa;&#xa;')"/>
					<xsl:text>&#xa;</xsl:text>
					<xsl:value-of select="substring-after($text, '&#xa;&#xa;')"/>
				</xsl:variable>
				<xsl:call-template name="normalize-line-breaks">
					<xsl:with-param name="text" select="$text"/>
				</xsl:call-template>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
</xsl:stylesheet>


Centroallee 1000, Einfahrt Parkhaus 7 an der "Alten Waltz" gegenüber Tryp Hotel ...
Centroallee 1000, Einfahrt Parkhaus 7 an der "Alten Waltz" gegenüber Tryp Hotel ...

Centroallee, 1000, Einfahrt, Parkhaus 7 an der, "Alten Waltz" gegenüber Tryp Hotel ...
Centroallee, 1000, Einfahrt, Parkhaus 7 an der, "Alten Waltz" gegenüber Tryp Hotel ...

Centroallee 1000 Einfahrt Parkhaus 7 an der "Alten Waltz" gegenüber Tryp Hotel ...
Centroallee 1000 Einfahrt Parkhaus 7 an der "Alten Waltz" gegenüber Tryp Hotel ...

Какт так
В Ваш шаблон уж сами приспособите

PS: {username}, может есть лучший способ? Буду рад выслушать неравнодушных
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы