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>
告诉我如何更正转换以获得所需的结果
答案 0 :(得分:2)
这有点令人困惑,因为样式表中包含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), ';')"/>
或者像这样,利用XSLT 2.0中可用的separator
属性。
<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>