2013-08-15 2 views
3

У меня есть шаблон XSLT, который выводит адресные данные как CSV. Я хочу обернуть некоторые из значений в двойные кавычки, потому что они содержат запятые как часть данных адреса.Поместите двойные кавычки вокруг значения в XSLT

Моя проблема в том, что после преобразования двойные кавычки отсутствуют. Я могу заставить процессор вставить почти что угодно, но не двойные кавычки, которые я хочу.

Вот некоторые примеры кода:

<xsl:value-of select="./*/*/LotNumber"/> 
<xsl:value-of select="$delim"/> 
<xsl:value-of select="./*/*/StreetName"/> 
<xsl:value-of select="$delim"/> 
<xsl:value-of select="./*/*/StreetType"/> 

Я ранее определено $ DELIM как:

<xsl:param name="delim" select="','" /> 

Так эта часть шаблона будет выводиться, например:

10,SMITH,ST 

Скажем, ради аргументов я хочу обернуть имя улицы в двойные кавычки, так что это получится как:

10,"SMITH",ST 

Я пробовал различные вещи, но они все вариации на тему объявляя двойные кавычки, как:

<xsl:param name="quote">"</xsl:param> 

А потом обертывание моей ценности как:

<xsl:value-of select="$quote"/> 
<xsl:value-of select="./*/*/StreetName"/> 
<xsl:value-of select="$quote"/> 

Но когда трансформация проходит, я ничего не получаю. Это выглядит так, как раньше. Другие предметы, которые я пробовал:

  • Ввод двойных кавычек в шаблон как литералы. Полностью закручивает вещи.
  • не используя " вместо». Никакого эффекта, и я вывод в виде текста, а не HTML в любом случае.
  • Использование и выбор переменной.

Любые предложения?

+0

Код с использованием $ quote правильный и должен работать. Проверьте основные вещи, подобные тому, что вы сохранили таблицу стилей (и очистили кеш), прежде чем запускать ее. –

+0

@MichaelKay Сделано, что без радости. У меня было больше успеха, используя два двойных кавычки в параметре, т. Е. "", однако поведение странно, поскольку оно затем кладет много двойных кавычек вокруг смежного поля. Я должен признать, что сейчас я просто не понимаю, что здесь происходит. –

+0

Извините, если это покровительственный вопрос, но что вы используете для просмотра CSV-файла, который вы создаете после преобразования? Обычный текстовый редактор или полное приложение для работы с электронными таблицами, такое как Microsoft Excel? –

ответ

5

В ответ на ваш комментарий , Я думаю, что проблема связана с Microsoft Excel здесь, а не с XSLT. Кавычки рассматриваются как текстовые разделители, и обычно вы будете использовать их только в том случае, если у вас есть поле с запятой, чтобы указать, что это всего лишь одно поле , а не два. В любом случае, когда вы читаете CSV-файл в Microsoft Excel, он не отображает текстовые разделители (независимо от того, содержит ли поле запятую или нет), только текст внутри них. Кавычки просто не считаются частью текста в поле, но просто используются для разграничения текста в поле, где оно может содержать специальные символы.

Кроме того, при сохранении файла в виде CSV-файла Excel будет использовать только текстовые разделители, если это необходимо (т. Е. Когда поле содержит запятую). Если в файле CSV были кавычки вокруг поля, которое не содержало запятую, например, в вашем примере 10,"SMITH",ST, они удаляются при сохранении.

Чтобы это доказать, попробуйте переименовать файл как .txt-файл перед тем, как обслуживать его в браузере (чтобы он открывался в IE или, возможно, в блокноте), и посмотрите, ожидаются ли данные.

Если намерение состояло в том, чтобы иметь кавычки как часть фактического текста поля, и не рассматривается как разделитель, вам нужно вывести ТРЕХ кавычки вокруг данных

<xsl:param name="delim" select="','" /> 
<xsl:param name="quote">"</xsl:param> 

<xsl:value-of select="./*/*/LotNumber"/> 
<xsl:value-of select="$delim"/> 
<xsl:value-of select="$quote"/> 
<xsl:value-of select="$quote"/> 
<xsl:value-of select="$quote"/> 
<xsl:value-of select="./*/*/StreetName"/> 
<xsl:value-of select="$quote"/> 
<xsl:value-of select="$quote"/> 
<xsl:value-of select="$quote"/> 
<xsl:value-of select="$delim"/> 
<xsl:value-of select="./*/*/StreetType"/> 

Итак, как текст, он будет выводиться следующим образом:

10,"""SMITH""",ST 

При открытии в Excel вы должны увидеть один набор кавычек вокруг «Смит».

Здесь нужны три кавычки, потому что внешними являются разделители текста, а затем пара последовательных кавычек затем обрабатываются как одинарная кавычка в фактическом поле.

+0

Это прибито Тимом. Это был Excel все время. Я изменил MIME-тип на text/plain, чтобы увидеть, что процессор выплескивал без Excel в середине, и вот, он делал именно то, что специфицировал XSLT. Черт бы тебя побрал Excel! –

+0

Это отличный ответ, но превращение его в переменную вместо param может быть лучшей идеей передать намерение. –

0

Я использую следующий подход в моем коде:

<xsl:output method="text" encoding="utf-8"/> 
<xsl:strip-space elements="*"/> 

<!-- Set the seperator and terminator to match CSV Styling--> 
<xsl:variable name="separator">","</xsl:variable> 
<xsl:variable name="terminator">"</xsl:variable> 
<xsl:template match="/"> 

<!-- HEADER ROW --> 
<xsl:result-document method="text" href="file:///Z:\Desktop Folder/XSLT_Results.csv"> 
<xsl:value-of select="$terminator"/> 
<xsl:text>Lot Number</xsl:text> 
<xsl:value-of select="$separator"/> 
<xsl:text>Street Name</xsl:text> 
<xsl:value-of select="$terminator"/> 
<xsl:value-of select="'&#xA;'"/> 

<!-- VALUE FIELDS BELOW --> 
<xsl:for-each select="OrgRefData:OrgRefData/Organisations/Organisation"> 
<xsl:choose> 

<!-- LIMIT RESULT SET--> 
<xsl:when test="WhenTestExpression = true]"> 

<xsl:value-of select="$terminator"/> 
<xsl:value-of select="LotNumber"/> 
<xsl:value-of select="$separator"/> 
<xsl:value-of select="StreetName"/> 
<xsl:value-of select="$terminator"/> 
</xsl:when> 
<xsl:otherwise/> 
</xsl:choose> 
</xsl:for-each> 
</xsl:result-document> 
</xsl:template> 

Использование переменных означает, что я могу развернуть соответствующие разделители для точного соответствия CSV форматирование взвешенным и структурированным способом.

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

  • Нет связанных вопросов^_^