Один из способов сделать это состоит в том, чтобы иметь различные подходящие шаблоны для элементов AName .
AName элементов, за которыми должна следовать запятая, должно иметь 2 илиследующие элементы AName :
<xsl:template match="AName[following-sibling::AName[following-sibling::AName]]">
Другие AName элементы, имеющие следующие элементы AName , которые не обнаруживаются при первом совпадении, затем должны быть "и", а не запятая, после них.
<xsl:template match="AName[following-sibling::AName]">
Все остальные элементы AName с последними в списке, и поэтому не имеют ничего следующего.
Итак, с учетом следующего XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="Authors">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="book">
<p>
<xsl:apply-templates select="@*|node()"/>
</p>
</xsl:template>
<xsl:template match="bName">
<b>
<xsl:value-of select="."/>
</b>
<br/>
</xsl:template>
<xsl:template match="AName">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="AName[following-sibling::AName]">
<xsl:value-of select="."/>
<xsl:text> and </xsl:text>
</xsl:template>
<xsl:template match="AName[following-sibling::AName[following-sibling::AName]]">
<xsl:value-of select="."/>
<xsl:text>, </xsl:text>
</xsl:template>
</xsl:stylesheet>
Применительно к следующему XML
<Authors>
<book>
<bName>HTML5</bName>
<AName>John</AName>
<AName>James</AName>
<AName>Jack</AName>
</book>
<book>
<bName>Java</bName>
<AName>Joe</AName>
</book>
<book>
<bName>XML</bName>
<AName>John</AName>
<AName>James</AName>
</book>
</Authors>
Выводится следующий HTML
<p><b>HTML5</b><br>John, James and Jack</p>
<p><b>Java</b><br>Joe</p>
<p><b>XML</b><br>John and James</p>
Doобратите внимание, что порядок соответствующих шаблонов в XSLT важен.Наиболее конкретный случай должен следовать после более общего случая.