Если у вас есть последовательность из двух узлов элементов с содержимым, которое вы показали, и вы хотите создать вывод с разделителем ,
между этими узлами, то одним из способов будет протолкнуть элементы через шаблон, который добавляет разделитель:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="root">
<xsl:param name="seq1" select="node1, node2"/>
<xsl:copy>
<xsl:apply-templates select="$seq1"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node1 | node2">
<xsl:if test="position() > 1">, </xsl:if>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty -development.net / pPJ8LVh
Если вы хотите работать на строковом уровне с string-join
, то сначала нужно сериализоватьнапример,
<xsl:output method="text"/>
<xsl:template match="root">
<xsl:param name="seq1" select="node1, node2"/>
<xsl:copy>
<xsl:value-of select="$seq1 ! serialize(node())" separator=", "/>
</xsl:copy>
</xsl:template>
https://xsltfiddle.liberty -development.net / pPJ8LVh / 1
<xsl:output method="text"/>
<xsl:template match="root">
<xsl:param name="seq1" select="node1, node2"/>
<xsl:variable name="str1" select="string-join($seq1 ! serialize(node()), ', ')"/>
<xsl:copy>
<xsl:value-of select="$str1"/>
</xsl:copy>
</xsl:template>
https://xsltfiddle.liberty -development.net / pPJ8LVh/ 2
Как видите, в последних двух примерах строки выводятся в виде текста, более вероятно, что вы захотите создать результирующие узлы, как это было сделано в первом предложении.