1
votes

I have following XML:

<library>
<elements>
    <element name="books">
        <property name="author">A</property>
        <property name="select">true</property>
    </element>
    <element name="books">
        <property name="author">B</property>
        <property name="select">false</property>
    </element>  
    <element name="books">
        <property name="author">C</property>
        <property name="select">true</property>
    </element>  
    <element name="books">
        <property name="author">A</property>
        <property name="select">true</property>
    </element>  
</elements>
</library>

I need to get output of all elements with name="books", which are selected (selected = true) and unique by author name. Must use xslt 1.0.

Expected result: author: A author: C

Must output data only for authors A and C.

Thanks in advance!

1
Well, try to write your verbal description as an XPath expression or match pattern, then follow the approach in jenitennison.com/xslt/grouping/muenchian.xml.Martin Honnen

1 Answers

0
votes
 not(.=preceding::*) 

to retrieve the unique values of the given xpath in for loop

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

     <xsl:template match="/">           
        <ul> 
      <xsl:for-each select="//elements/element[@name = 'books' and property[@name = 'select' and .='true'] ]/property[@name = 'author' and not(.=preceding::*)]">
    <li>
      <xsl:value-of select="concat('author :',.)"/>
        </li>   
      </xsl:for-each>            
</ul>
  </xsl:template>

</xsl:stylesheet>

OUTPUT XML :

author :A author :C