2016-03-08 4 views
0

У меня есть список со значениями, которые могут быть повторены, в примере:как создать отчетливый список из 2-х полей с XSLT

<dates> 
    <date> 
     <month>January</month> 
     <year>2015</year> 
    </date> 

    <date> 
     <month>January</month> 
     <year>2016</year> 
    </date> 

    <date> 
     <month>February</month> 
     <year>2015</year> 
    </date> 

    <date> 
     <month>January</month> 
     <year>2016</year> 
    </date> 
</dates> 

хотело бы получить список с отчетливым списком:

января 2015
Февраль 2015
января 2016

Не уверен, что это возможно, и я могу изменить код ниже с Еогеаспом:

<li> 
     <xsl:value-of select="distinct-values(.)"/> 
    </li>   

или:

<li> 
     <xsl:foreach select="//dates/date[not(.preceding::*)]"? 
    </li> 

ответ

0

Это должно сделать:

distinct-values(/dates/date/concat(month, ' ', year))

XPath является выбор конкатенацию month и year, а затем выберите distinct-values среди них.

1

Заказ объектов может быть достигнут с помощью следующего шаблона XSLT 1.0. Это устраняет дубликаты и сортирует по year с:

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

    <xsl:key name="someDate" match="date" use="concat(month/text(),' ',year/text())" /> 

    <xsl:template match="/dates"> 
    <xsl:for-each select="date[generate-id() = generate-id(key('someDate',concat(month/text(),' ',year/text()))[1])]"> 
     <xsl:sort select="year/text()" />  
     <xsl:value-of select="concat(month/text(),' ',year/text())" /><xsl:text>&#10;</xsl:text> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

Результат:

<?xml version="1.0"?> 
January 2015 
February 2015 
January 2016 

Однако это не сортирует имена в месяц, это просто сортирует годы.

Если вы хотите, чтобы окружать результаты с li элементов, заменить xsl:value-of с

<li> 
    <xsl:value-of select="concat(month/text(),' ',year/text())" /> 
</li> 

 Смежные вопросы

  • Нет связанных вопросов^_^