exslt节点集中的不同值

时间:2015-06-25 14:15:04

标签: xslt exslt

我有一个程序从exslt中的函数接收节点集。它包含重复的节点(Tom Waits出现两次):

    

<xsl:template name="giveMeHeroes">
    <person>
        <lastName>Waits</lastName>
        <firstName>Tom</firstName>
    </person>
    <person>
        <lastName>Everett</lastName>
        <firstName>Mark</firstName>
    </person>
    <person>
        <lastName>Hickey</lastName>
        <firstName>Rich</firstName>
    </person>
    <person>
        <lastName>Waits</lastName>
        <firstName>Tom</firstName>
    </person>
</xsl:template>

<xsl:template match="/">

    <xsl:variable name="someHeroes">
        <xsl:call-template name="giveMeHeroes"></xsl:call-template>
    </xsl:variable>


    <xsl:apply-templates select="ext:node-set($someHeroes)/person"/>

</xsl:template>


<xsl:template match="person">
    <xsl:value-of select="concat('Long live',firstName,' ',lastName,'!!!')"/>
    <br/>
</xsl:template>

此示例产生(在浏览器中解析):

Long live Tom Waits!!!
Long live Mark Everett!!!
Long live Rich Hickey!!!
Long live Tom Waits!!! 

我知道我应该能够使用set:distinct(nodeset)过滤结果,可能是<xsl:apply-templates select="set:distinct(ext:node-set($someHeroes)/person)"/>行,但不知怎的,我找不到这样做的方法。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您的代码应该在http://xsltransform.net/gWmuiJX中使用Saxon 6.5.5并且适用于我,它确实

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
  xmlns:exsl="http://exslt.org/common"
  xmlns:set="http://exslt.org/sets"
  exclude-result-prefixes="exsl set">

    <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

<xsl:template name="giveMeHeroes">
    <person>
        <lastName>Waits</lastName>
        <firstName>Tom</firstName>
    </person>
    <person>
        <lastName>Everett</lastName>
        <firstName>Mark</firstName>
    </person>
    <person>
        <lastName>Hickey</lastName>
        <firstName>Rich</firstName>
    </person>
    <person>
        <lastName>Waits</lastName>
        <firstName>Tom</firstName>
    </person>
</xsl:template>

<xsl:template match="/">

    <xsl:variable name="someHeroes">
        <xsl:call-template name="giveMeHeroes"></xsl:call-template>
    </xsl:variable>


    <xsl:apply-templates select="set:distinct(exsl:node-set($someHeroes)/person)"/>

</xsl:template>


<xsl:template match="person">
    <xsl:value-of select="concat('Long live',firstName,' ',lastName,'!!!')"/>
    <br/>
</xsl:template>
</xsl:transform>

并输出Long liveTom Waits!!!<br>Long liveMark Everett!!!<br>Long liveRich Hickey!!!<br>