如何使用xslt中的xsl:text列出和隔离非重复节点

时间:2017-04-04 13:39:45

标签: xslt-1.0

这是我的xslt

            

true

我希望这种格式的输出第一个CarrierName应该以' **'开头。最后的'和'其余的应修改为','所有CarrierName都没有向Kingfisher提供

输出:** CityFlyer,中华航空公司和印度航空公司

我的实际输入如下

fnmatch("/*", "/foo.txt"); //=> true

1 个答案:

答案 0 :(得分:0)

首先,我建议您使用Muenchian grouping获取不同的运营商列表(或者,如果您的处理器支持它,使用扩展功能),而不是检查前一个兄弟姐妹的笨拙(和低效)方法

一旦你有了,其余的都是微不足道的:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:key name="seg-by-carier" match="BookingFlightSegment" use="CarrierName" />

<xsl:template match="/Response">
    <xsl:text>**</xsl:text>
    <xsl:for-each select="FlightSegment/BookingFlightSegment[count(. | key('seg-by-carier', CarrierName)[1]) = 1]">
        <xsl:value-of select="CarrierName" />
        <xsl:choose>
            <xsl:when test="position()=last() - 1"> and </xsl:when>
            <xsl:when test="position()!=last()">, </xsl:when>
        </xsl:choose>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

请注意,在您尝试时,position()函数会返回整个所选节点集中当前节点的位置,包括重复项。因此,在xsl:if条件下,测试position()=last()永远不会返回true(除非没有重复)。