XSLT - XML в CSV - шаблон против каждого - удалить пробелы
(1) Почему Option1 (Template) создает пробелы (в основном между rec1 и 5), а Option2 (ForEach) нет?
(2) Если возможно, как мне кодировать вариант 1 для удаления полученного пробела?
Предположения: использование XSLT v1., XMLPad/Stylus для тестирования, MSXML4.
Работая над обработкой больших, более сложных входных файлов XML (набор элементов / атрибутов) с несколькими критериями выбора типа, чтобы создать несколько выходных файлов TSV. Ряд ссылок, кажется, указывают на использование шаблонов в качестве предпочтительного метода. Использование соответствия в настоящее время вытесняет слишком много пробелов в очередь сообщений.
XML:
<main>
<event>
<event_type>Bike</event_type>
<date>2012-02-05</date>
</event>
<event>
<event_type>Run</event_type>
<date>2012-02-06</date>
</event>
<event>
<event_type>Swim</event_type>
<date>2012-02-07</date>
</event>
<event>
<event_type>Run</event_type>
<date>2012-02-08</date>
</event>
<event>
<event_type>Bike</event_type>
<date>2012-02-09</date>
</event>
</main>
XSL:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="tab" select="'	'" />
<xsl:template match="@*|text()"/>
<xsl:template match="/">
<xsl:text/>event<xsl:value-of select="$tab"/>
<xsl:text/>date<xsl:value-of select="$tab"/>
<xsl:apply-templates/>
</xsl:template>
<!-- OPTION1 -->
<xsl:template match="event[event_type='Bike']"><xsl:text>
</xsl:text>
<xsl:value-of select="event_type"/><xsl:value-of select="$tab"/>
<xsl:value-of select="date"/>
</xsl:template>
<!-- OPTION2 -->
<!--<xsl:template match="@*|node()">
<xsl:for-each select="event[event_type='Bike']"><xsl:text>
</xsl:text>
<xsl:value-of select="event_type"/><xsl:value-of select="$tab"/>
<xsl:value-of select="date"/>
</xsl:for-each>
</xsl:template>-->
</xsl:stylesheet>
Вывод - шаблон Opt1 (пока не могу опубликовать фото, ... это пробел)
Дата события......
Велосипед....2012-02-05............
Велосипед....2012-02-09.
Выход - Opt2 ForEach
Дата события.....
Велосипед.... 2012-02-05
Велосипед.... 2012-02-09
2 ответа
Я пробовал другой редактор (Architag XRay Xml Editor, который использует MSXML), и чтобы он работал, мне пришлось использовать символы CR/LF. Я считаю, что ответ Димитра правильный. Это моя модификация:
<!-- OPTION1 -->
<xsl:template match="event[event_type='Bike']">
<xsl:text> </xsl:text>
<xsl:value-of select="event_type"/><xsl:value-of select="$tab"/>
<xsl:value-of select="date"/>
</xsl:template>
Вы хотите это:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="vTab" select="'	'" />
<xsl:variable name="vNL" select="' '" />
<xsl:template match="@*|text()"/>
<xsl:template match="/*">
<xsl:value-of select=
"concat(' event', $vTab, 'date', $vTab, $vNL)"/>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="event[event_type='Bike']">
<xsl:value-of select=
"concat(' ', event_type, $vTab, date, $vNL)"/>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному документу XML:
<main>
<event>
<event_type>Bike</event_type>
<date>2012-02-05</date>
</event>
<event>
<event_type>Run</event_type>
<date>2012-02-06</date>
</event>
<event>
<event_type>Swim</event_type>
<date>2012-02-07</date>
</event>
<event>
<event_type>Run</event_type>
<date>2012-02-08</date>
</event>
<event>
<event_type>Bike</event_type>
<date>2012-02-09</date>
</event>
</main>
желаемый, правильный результат получается:
event date
Bike 2012-02-05
Bike 2012-02-09