У меня есть следующий пример ввода xml.
<inputM xmlns = "http://example.com">
<Title>test</Title>
<Gender>ffff</Gender>
<MiddleName>dere</MiddleName>
<Surname>qqq</Surname>
<PreferredName>ppp</PreferredName>
</inputM>
Основываясь на логике, я хочу сгенерировать сообщение JSON. Для этого я использовал ниже xslt.
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" xmlns:ns = "http://example.com" xmlns:func = "http://exslt.org/functions">
<xsl:output method = "text" omit-xml-declaration = "yes" indent = "no" encoding = "UTF-8" media-type = "application/json"/>
<xsl:template match = "ns:inputM">
<xsl:text>{"outputX": {</xsl:text>
<xsl:value-of select = "ns:getChangedValue(//ns:inputM/ns:Title,'xxx','title')" />
<xsl:value-of select = "ns:getChangedValue(//ns:inputM/ns:Gender,'yyy','gender')" />
<xsl:value-of select = "ns:getChangedValue(//ns:inputM/ns:MiddleName,'zzz','middleName')" />
<xsl:value-of select = "ns:getChangedValue(//ns:inputM/ns:Surname,'qqq','surname')" />
<xsl:value-of select = "ns:getChangedValue(//ns:inputM/ns:PreferredName,'ppp','preferredName')" />
<xsl:text>}}</xsl:text>
</xsl:template>
<xsl:function name = "ns:getChangedValue">
<xsl:param name = "inputValue"/>
<xsl:param name = "default"/>
<xsl:param name = "jsonField"/>
<xsl:if test = "$inputValue != $default">
<xsl:choose>
<xsl:when test = "$inputValue = 'TEST'" >
<func:result>
<xsl:value-of select = "concat('"',$jsonField,'": " removed')" />
<xsl:text>"</xsl:text>
<xsl:text>,</xsl:text>
</func:result>
</xsl:when>
<xsl:otherwise>
<func:result>
<xsl:value-of select = "concat('"',$jsonField,'": "', $inputValue)" />
<xsl:text>"</xsl:text>
<xsl:text>,</xsl:text>
</func:result>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:function>
</xsl:stylesheet>
Сгенерированный вывод, как показано ниже.
{"outputX": {"title": "test","gender": "ffff","middleName": "dere",}}
Всегда есть лишний "," после последнего элемента в выходном сообщении. Есть ли способ избежать этого из одного файла xslt





Вы выводите запятую в своей функции, но, очевидно, функция не знает, появится ли следующее значение или нет.
Один из способов решить эту проблему - изменить функцию, чтобы она не добавляла запятую, и чтобы все вызовы функций выполнялись с помощью одного xsl:value-of с separator.
Попробуйте этот XSLT
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "2.0" xmlns:ns = "http://example.com" xmlns:func = "http://exslt.org/functions">
<xsl:output method = "text" omit-xml-declaration = "yes" indent = "no" encoding = "UTF-8" media-type = "application/json"/>
<xsl:template match = "ns:inputM">
<xsl:text>{"outputX": {</xsl:text>
<xsl:value-of select = "ns:getChangedValue(//ns:inputM/ns:Title,'xxx','title'),
ns:getChangedValue(//ns:inputM/ns:Gender,'yyy','gender'),
ns:getChangedValue(//ns:inputM/ns:MiddleName,'zzz','middleName'),
ns:getChangedValue(//ns:inputM/ns:Surname,'qqq','surname'),
ns:getChangedValue(//ns:inputM/ns:PreferredName,'ppp','preferredName')" separator = ", " />
<xsl:text>}}</xsl:text>
</xsl:template>
<xsl:function name = "ns:getChangedValue">
<xsl:param name = "inputValue"/>
<xsl:param name = "default"/>
<xsl:param name = "jsonField"/>
<xsl:if test = "$inputValue != $default">
<xsl:choose>
<xsl:when test = "$inputValue = 'TEST'" >
<func:result>
<xsl:value-of select = "concat('"',$jsonField,'": " removed')" />
<xsl:text>"</xsl:text>
</func:result>
</xsl:when>
<xsl:otherwise>
<func:result>
<xsl:value-of select = "concat('"',$jsonField,'": "', $inputValue)" />
<xsl:text>"</xsl:text>
</func:result>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:function>
</xsl:stylesheet>
Обратите внимание, что вам действительно следует изменить номер версии XSLT на «2.0».