Do czego może być przydatny znacznik <xsl:key>?
Do czego może być przydatny znacznik <xsl:key>?
Znacznik <xsl:key> można wykorzystać do zdefiniowania klucza dla wybranych węzłów XML. Umożliwi to wyszukanie węzłów na podstawie zadanej wartości klucza. Można to zilustrować następującym przykładem. Załóżmy, że dokument XML ma następującą postać:
<?xml version="1.0" encoding="UTF-8"?> <baza-danych xsi:noNamespaceSchemaLocation="baza.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <panstwa> <panstwo id="PL">Polska</panstwo> <panstwo id="DE">Niemcy</panstwo> <panstwo id="FR">Francja</panstwo> </panstwa> <miasta> <miasto panstwo="PL">Warszawa</miasto> <miasto panstwo="PL">Poznań</miasto> <miasto panstwo="DE">Berlin</miasto> <miasto panstwo="DE">Monachium</miasto> <miasto panstwo="FR">Paryż</miasto> </miasta> </baza-danych>
Transformata wypisująca nazwy miast i odpowiadające im nazwy państw może wyglądać następująco:
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" /> <xsl:key name="klucz" match="panstwo" use="@id" /> <xsl:template match="/baza-danych"> <HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8" /> <TITLE>Lista miast</TITLE> </HEAD> <BODY> <TABLE border="1"> <TR> <TH>MIASTO</TH> <TH>PAŃSTWO</TH> </TR> <xsl:for-each select="miasta/miasto"> <TR> <TD><xsl:value-of select="." /></TD> <TD><xsl:value-of select="key('klucz', @panstwo)" /></TD> </TR> </xsl:for-each> </TABLE> </BODY> </HTML> </xsl:template> </xsl:stylesheet>