Текст метода вывода XSL, включая пробелы в xsl - PullRequest
3 голосов
/ 01 октября 2010

Я создаю xsl для преобразования моего xml в текст (который в конечном итоге будет csv).Я использую VS2008.Когда я использую редактор для создания xsl, преобразованный вывод с отступом в соответствии с моим xsl.Однако, если я редактирую xsl и удаляю отформатированные пробелы, он выводит правильно - но делать это так, как будто это кошмар для работы.

Есть ли какие-либо команды препроцессора xsl или разметка, которые я могу вставить, чтобы предотвратить это?Я хочу игнорировать любые пробелы в моем xsl и выводить только текст, используя <!CDATA[]]> или <xsl:text>.

Мой XSL такой, как показано ниже - это отступ для вывода

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="text" indent="no"/>
  <!-- @* is all class attributes -->
  <xsl:template match="/">
    <xsl:text>CSV Output</xsl:text>
    <!-- Start of output -->
    <xsl:for-each select="//rows/row">
      <![CDATA[row id=]]><xsl:value-of select="(@id)"/>
    </xsl:for-each>
    <!-- OK, that is the end of the file -->
    <![CDATA[<EOF>]]>
  </xsl:template>
</xsl:stylesheet>

Выводэто выглядит следующим образом:

CSV Output
      row id=0
      row id=1
    <EOF>

Тем не менее, правильно выводятся следующие данные:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="text" indent="no"/>
  <!-- @* is all class attributes -->
  <xsl:template match="/">
    <xsl:text>CSV Output</xsl:text>
    <!-- Start of output -->
    <xsl:for-each select="//rows/row">
<![CDATA[row id=]]><xsl:value-of select="(@id)"/>
</xsl:for-each>
<!-- OK, that is the end of the file -->
<![CDATA[<EOF>]]>
  </xsl:template>
</xsl:stylesheet>

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

CSV Output
row id=0
row id=1
<EOF>

Я также хочуконтроль, где новая строка включена.В моем xsl я не говорю, чтобы он включал один.

Пожалуйста, помогите !!

Спасибо,

Andez

Ответы [ 2 ]

6 голосов
/ 01 октября 2010

XSLT-процессор удаляет пустые текстовые узлы в шаблоне только между элементами XSLT.

Таким образом, в

<xsl:for-each select="//rows/row"> 
  <![CDATA[row id=]]><xsl:value-of select="(@id)"/> 
</xsl:for-each>

элемент xsl:for-each имеет два дочерних пробельных текстаузлы: один после xsl:value-of, который удаляется;другой перед разделом CDATA, который не разделен.

Итог: используйте xsl:text элементов.

<xsl:for-each select="//rows/row"> 
  <xsl:text><![CDATA[row id=]]></xsl:text>
  <xsl:value-of select="@id"/> 
</xsl:for-each>
5 голосов
/ 01 октября 2010

Вы можете использовать элемент xsl:strip, чтобы указать, какие элементы не должны иметь пробелов (или использовать * для всех элементов):

<xsl:strip-space elements="*"/>

Счетчик имеет значение xsl:preserve, что позволяет вам объявить, какие элементы должны сохранять пробелы. Вы можете использовать оба:

<xsl:strip-space elements="*"/>
<xsl:preserve-space elements="td span"/>
<!-- strip spaces from all elements apart from td and span elements -->
...