Как соотнести много значений атрибутов для XML? - PullRequest
1 голос
/ 27 марта 2019

SOAP Сообщение:

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>   
        <field_21>
            <row StartDate="2017-01-01" EndDate="2017-01-07" DaysCount="7" Diagnoz="A00.0"/>
            <row StartDate="2019-02-01" EndDate="2019-02-07" DaysCount="8" Diagnoz="A10.0"/>
        </field_21>
   </soapenv:Body>
</soapenv:Envelope>

Мой xslt:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"  version="1.0">
    <xsl:template match="/">
        <result>            
            <xsl:value-of select="string-join(
               concat(//field_21/row/@StartDate, ' ', 
                        //field_21/row/@EndDate, ' ', 
                        //field_21/row/@DaysCount, ' ', 
                        //field_21/row/@Diagnoz), ';')"/>
        </result>         
    </xsl:template>
</xsl:stylesheet>

Результат:

<result xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">2017-01-01 2017-01-07 7 A00.0</result>

Результат, который мне нужен:

<result xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">2017-01-01 2017-01-07 7 A00.0; 2019-02-01 2019-02-07 8 A10.0</result>

Подскажите, как исправить мое преобразование, чтобы получить требуемый результат

1 Ответ

2 голосов
/ 27 марта 2019

Это немного сбивает с толку, потому что ваша таблица стилей содержит version="1.0", но string-join доступна только в XSLT 2.0.Тем не менее, если бы вы использовали XSLT 2.0, я бы ожидал, что concat выйдет из строя, потому что //field_21/row/@StartDate возвращает несколько узлов, что недопустимо в XSLT 2.0

Но, если вы действительно используете XSLT 2.0,Вы можете написать выражение следующим образом:

<xsl:value-of select="string-join(//field_21/row/concat(@StartDate, ' ', @EndDate, ' ', @DaysCount, ' ', @Diagnoz), ';')"/>

Или вот так, чтобы воспользоваться атрибутом separator, доступным в XSLT 2.0.

<xsl:value-of select="//field_21/row/concat(@StartDate, ' ', @EndDate, ' ', @DaysCount, ' ', @Diagnoz)" separator="; " />

Если, однако, выможно использовать только XSLT 1.0, вам придется использовать xsl:for-each (или xsl:apply-templates

<xsl:for-each select="//field_21/row">
    <xsl:if test="position() > 1">; </xsl:if>
    <xsl:value-of select="concat(@StartDate, ' ', @EndDate, ' ', @DaysCount, ' ', @Diagnoz)" />
</xsl:for-each>
...