Я немного изменил исходное преобразование, чтобы получить желаемый результат.По сути, шаблонное правило apply
решает парентезис функции.Чтобы определить, стоит ли вставлять запятую, я проверяю наличие следующих элементов одного типа.
Более того, я заменил ваш xsl:sequence
на xsl:value-of
, предотвращая тем самым создание нежелательных пробелов (я представляю себеони нежелательны).Также была заменена функция element()
.Таблица стилей теперь совместима с XSLT 1.0.Мне не нравится XSLT 1.0, но я предпочитаю использовать новые функции только тогда, когда это действительно необходимо.
Это решение не очень общее (MATHML - огромная спецификация, которую вы знаете), но вы можете использовать его и адаптировать к более сложным случаям.
XSLT 1.0 проверено в соответствии с Saxon 6.5.5
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="apply">
<xsl:value-of select="concat(name(child::*[1]),'(')"/>
<xsl:apply-templates select="apply|cn|ci"/>
<xsl:value-of select="')'"/>
<xsl:if test="count(following-sibling::*)">
<xsl:value-of select="','"/>
</xsl:if>
</xsl:template>
<xsl:template match="cn|ci">
<xsl:value-of select="."/>
<xsl:if test="count(following-sibling::*)>0">
<xsl:value-of select="','"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
При применении к входу, указанному в вопросе, получается:
eq(plus(power(x,2),times(2,x),2),0)