2015-06-25 5 views
0

У меня есть программа, которая получает набор узлов из функции в exslt. Он содержит повторяющиеся узлы (Том Уэйтс появляется дважды):Отличительные значения в узле exslt

<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

Ваш код должен делать, и работает для меня с Saxon 6.5.5 в http://xsltransform.net/gWmuiJX, он делает

<?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>.

+0

Действительно, это не проблема возникает только в PhpStorm XSLT плагин двигателя .... ошибка: ошибка: '-1' [ERROR]: java.lang.ArrayIndexOutOfBoundsException: -1 Но почему это так это другой вопрос .. – Peter