У меня есть следующий код, если Destination не присутствует, ни терминал, ни внимание не должны отображаться.Как объединить элементы в список, разделенный запятой, с помощью XSLT?
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="Request.xsl" />
<xsl:template name="Params">
<xsl:apply-templates select="/Params/Destinations"/>
</xsl:template>
<xsl:template name="Params">
<xsl:choose>
<xsl:when test="string-length($Destinations) > 0">
<xsl:value-of select="$Destinations"/>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:variable name="Desinations">
<xsl:for-each select="/Params/Destination1/text() |
/Params/Destination2/text() |
/Params/Destination3/text() |
/Params/Destination4/text() |
/Params/Destination5/text()">
<xsl:value-of select="."/>
<xsl:if test="name(.) = 'Destination1'">
<xsl:apply-templates select="/Params/Terminal1"/>
<xsl:apply-templates select="/Params/Attention1"/>
</xsl:if>
<!-- This xsl:if is repeated 5 more times with Destination2, Destination3, etc. -->
<xsl:if test="not(position() = last())">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:template match="Destination1">
<!-- Covered in the Destinations template -->
</xsl:template>
<xsl:template match="Terminal1">
<xsl:if test="(. != '')">
<xsl:text>-</xsl:text>
<xsl:copy-of select="." />
</xsl:if>
</xsl:template>
<xsl:template match="Attention1">
<xsl:if test="(. != '')">
<xsl:text>-</xsl:text>
<xsl:copy-of select="." />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Я хотел бы иметь возможность получить результат, как так:
Destination1-terminal1, Destination2-Terminal2, Destination3-Terminal3-Attention3
Я получаю следующее результат:
Пункт назначения3, Пункт назначения1, Пункт назначения2-Терминал2-Терминал3-Внимание3
Как вы видите, адресаты не работают, терминал 1 отсутствует, а все остальные элементы терминала и внимания прикреплены к Destination2.
Я не совсем уверен, как объединить элементы Destination-Terminal-Attention вместе и получить запятую после последнего элемента в этом наборе. Например, если Attention не имеет значения, я бы хотел, чтобы запятая появилась после терминала, и если ни у терминалов, ни у Attention нет значений, запятая должна появиться после Destination.
Добавлен источник XML:
<?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:include href="../base/Formatting.xsl" />
<xsl:template match="/">
<xsl:text>TO/</xsl:text>
<xsl:call-template name="Destinations"/>
<xsl:apply-templates select="Params"/>
</xsl:template>
<xsl:template name="Destinations" />
<xsl:template name="Params"/>
<xsl:template match="Params">
<xsl:call-template name="Params"/>
</xsl:template>
</xsl:stylesheet>
Edit: Я сделал изменения в шаблон Params, просто заходящее Направление. Теперь ни один из полей терминала или внимания не появляется, поэтому, возможно, это шаг назад.
Не могли бы вы опубликовать пример ввода? Также укажите XSLT 1.0 или 2.0. –
Это XSLT 1.0. Я новичок в XSLT, поэтому я не уверен, что вы подразумеваете под примером ввода. Он приходит через форму, где каждый пункт назначения, терминал, внимание - это поле. Назначение - буквенно-цифровое значение длиной 4 символа (ex 1UPD). Терминал представляет собой буквенно-цифровое значение длиной 3 символа (например, US4), а значение - буквенно-цифровое значение длиной 14 символов. Если это не то, что вы ищете, дайте мне знать. Благодаря! – Robert
Вход в XSLT является XML-документом. Нам нужно увидеть (или, желательно, минимизированный, но все еще полный пример), чтобы попытаться воспроизвести вашу проблему. Хотя я нахожусь в этом: минимизация вашего XSLT-кода только для того, что необходимо для воспроизведения проблемы **, и ** сделать это завершено также будет полезно. –