Удалить лишние символы из xslt - PullRequest
0 голосов
/ 17 мая 2019

У меня есть следующий пример ввода 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('&quot;',$jsonField,'&quot;: &quot; removed')" />
                        <xsl:text>"</xsl:text>
                        <xsl:text>,</xsl:text>
                        </func:result>
                    </xsl:when>
                    <xsl:otherwise>
                        <func:result>
                        <xsl:value-of select="concat('&quot;',$jsonField,'&quot;: &quot;', $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

1 Ответ

1 голос
/ 17 мая 2019

Вы выводите запятую в своей функции, но, очевидно, функция не знает, появится ли следующее значение или нет.

Одним из способов ее решения было бы изменение функции, чтобы она не добавляла запятую, и чтобы все вызовы функций выполнялись с одним 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('&quot;',$jsonField,'&quot;: &quot; removed')" />
                    <xsl:text>"</xsl:text>
                    </func:result>
                </xsl:when>
                <xsl:otherwise>
                    <func:result>
                    <xsl:value-of select="concat('&quot;',$jsonField,'&quot;: &quot;', $inputValue)" />
                    <xsl:text>"</xsl:text>
                    </func:result>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:if>
    </xsl:function>
</xsl:stylesheet>

Обратите внимание, что вы действительно должны изменить номер версии XSLT на "2.0".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...