Это довольно грубый подход, который основан на том, что вы знаете имена элементов, за которыми следуют запятые.
Версия 1 - Имена элементов известны
<xsl:template match="*[@class]">
<!-- copy the computed element name to a variable for ease of use -->
<xsl:variable name="elementName" select="substring-after(@class, 'one_')"/>
<xsl:element name="{$elementName}">
<xsl:copy-of select="@*[not(name()='class')]"/>
<!-- insert "author" comma -->
<xsl:if test="$elementName='author'"><dl>,</dl></xsl:if>
<!-- process contents -->
<xsl:apply-templates>
<xsl:sort select="@id" data-type="number"/>
</xsl:apply-templates>
</xsl:element>
<!-- insert 'given-name' and 'surname' commas -->
<xsl:if test="$elementName='given-name' or $elementName='surname'"><dl>,</dl></xsl:if>
</xsl:template>
<!-- strip out the 'author' commas where they would normally end up -->
<xsl:template match="text()[normalize-space(.)=','][ancestor-or-self::*[@class='one_author']"/>
Если вы не можете быть уверены в том, какие элементы будут начинаться с запятых или после них, то другой способ сделать это - проверить наличие запятой и затем вывести ее там, где вы хотите:
Версия 1 - Имена элементов неизвестны
<xsl:element name="{$elementName}">
<xsl:copy-of select="@*[not(name()='class')]"/>
<!-- insert comma if first text child is a comma -->
<xsl:if test="starts-with(normalize-space(text()[1]), ',')"><dl>,</dl></xsl:if>
<!-- process contents -->
<xsl:apply-templates>
<xsl:sort select="@id" data-type="number"/>
</xsl:apply-templates>
</xsl:element>
<!-- insert comma if the element is immediately followed by a comma -->
<xsl:if test="normalize-space(following-sibling::text()[1])=','"><dl>,</dl></xsl:if>
</xsl:template>
<!-- strip out the 'author' commas where they would normally end up -->
<xsl:template match="text()[normalize-space(.)=','][ancestor-or-self::*[@class='one_author']"/>
Будет ли более подходящей версия 2, будет зависеть от того, могут ли содержать другие произвольные элементы, которых вы не знаетезнаю, но также полагается, что нет других элементов, которые начинаются с запятых или сопровождаются запятыми, которые вы не хотите сохранять.
Надеюсь, это поможет.