Sunday, 3 January 2016

XML : XSLT - key function

I want to use key() function in XSLT and display value of attribute for each element "dystrybutor". I know that it could be done in easier way, but i want to make it that way if is it possible.

Here is my XML

  <document>      <płytoteka>          <bestseller rok="2015">              <płyta id="p01" gatunek="Pop&amp;Rock">                  <tytuł>Atramentowa</tytuł>                  <wykonawca>Celińska Stanisława</wykonawca>                  <data_premiery>2015-05-08</data_premiery>                  <dystrybutor idref="d1" />                  <cena waluta="PLN">37.49</cena>                  <rok_nagrania>2015</rok_nagrania>              </płyta>              <płyta id="p08" gatunek="Pop&amp;Rock">                  <tytuł>Składam się z ciągłych powtórzeń</tytuł>                  <wykonawca>Rojek Artur</wykonawca>                  <data_premiery>2014-04-04</data_premiery>                  <dystrybutor idref="d1" />                  <cena waluta="PLN">33.99</cena>                  <rok_nagrania>2014</rok_nagrania>              </płyta>          </bestseller>      </płytoteka>  </document>    

and XSLT

  <?xml version="1.0" encoding="UTF-8"?>  <xsl:stylesheet version="2.0"                  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                   xmlns:xs="http://www.w3.org/2001/XMLSchema"                  exclude-result-prefixes="xs"                   xmlns:date="http://exslt.org/dates-and-times"                  extension-element-prefixes="date"                   xmlns:math="http://exslt.org/math"                  xmlns:fn="http://www.w3.org/2005/xpath-functions">        <xsl:output method="xml" version="1.0" encoding="UTF-8"          indent="yes" />        <xsl:template match="*">          <xsl:copy>              <xsl:apply-templates select="@* | node()" />          </xsl:copy>      </xsl:template>        <xsl:template match="@* | *[not(node())]" />        <xsl:template match="/document">          <xsl:apply-templates />      </xsl:template>        <xsl:template match="/">          <xsl:element name="document">              <xsl:apply-templates />          </xsl:element>      </xsl:template>        <xsl:template match="//płytoteka">          <xsl:element name="płytoteka">              <xsl:apply-templates select="bestseller" />          </xsl:element>      </xsl:template>        <xsl:template match="//bestseller">          <xsl:element name="bestseller">              <xsl:attribute name="rok">                <xsl:value-of select="./@rok" />            </xsl:attribute>              <xsl:apply-templates select="płyta" />          </xsl:element>      </xsl:template>        <xsl:template match="//płyta">          <xsl:element name="płyta">              <xsl:attribute name="id">                  <xsl:value-of select="./@id" />              </xsl:attribute>              <xsl:element name="gatunek">                  <xsl:value-of select="./@gatunek" />              </xsl:element>              <xsl:element name="tytuł">                  <xsl:value-of select="./tytuł" />              </xsl:element>              <xsl:element name="wykonawca">                  <xsl:value-of select="./wykonawca" />              </xsl:element>              <xsl:element name="data_premiery">                  <xsl:value-of select="./data_premiery" />              </xsl:element>              <xsl:element name="dystrybutor">                  <xsl:variable name="WybranyDystrybutor" select="key('dystrybutorKEY', @idref)" />                   <!--<xsl:attribute name="idref">                      <xsl:value-of select="./dystrybutor/@idref" />                  </xsl:attribute>-->                  <xsl:attribute name="idref">                      <xsl:value-of select="$WybranyDystrybutor/@idref" />                  </xsl:attribute>              </xsl:element>              <xsl:apply-templates select="cena"/>              <xsl:element name="rok_nagrania">                  <xsl:value-of select="./rok_nagrania" />              </xsl:element>              <xsl:apply-templates select="playlista" />          </xsl:element>      </xsl:template>        <xsl:key use="@idref" name="dystrybutorKEY" match="//bestseller/płyta/dystrybutor" />    </xsl:stylesheet>    

I expect

  <?xml version="1.0" encoding="UTF-8"?>  <document>        <płytoteka>        <bestseller rok="2015">           <płyta id="p01">              <gatunek>Pop&amp;Rock</gatunek>              <tytuł>Atramentowa</tytuł>              <wykonawca>Celińska Stanisława</wykonawca>              <data_premiery>2015-05-08</data_premiery>              <dystrybutor idref="d1"/>              <cena>37.49</cena>              <rok_nagrania>2015</rok_nagrania>           </płyta>           <płyta id="p08">              <gatunek>Pop&amp;Rock</gatunek>              <tytuł>Składam się z ciągłych powtórzeń</tytuł>              <wykonawca>Rojek Artur</wykonawca>              <data_premiery>2014-04-04</data_premiery>              <dystrybutor idref="d1"/>              <cena>33.99</cena>              <rok_nagrania>2014</rok_nagrania>           </płyta>        </bestseller>     </płytoteka>  </document>    

Thank you in advance.

No comments:

Post a Comment