W jaki sposób korzystając z XSLT stworzyć kwerendę łączącą dane z dwóch tabel zamodelowanych w XML?
W jaki sposób korzystając z XSLT stworzyć kwerendę łączącą dane z dwóch tabel zamodelowanych w XML?
Przyjmijmy, że dane przedstawiają się następująco:
<?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>
Chcemy stworzyć transformatę do formatu HTML, która przedstawi w tabelce nazwy miast i odpowiadające im nazwy państw. W tym celu trzeba dokonać odpowiednich asocjacji pomiędzy węzłami państw i miast:
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" /> <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"> <xsl:variable name="kraj" select="@panstwo" /> <TR> <TD><xsl:value-of select="." /></TD> <TD><xsl:value-of select="//panstwo[@id=$kraj]" /></TD> </TR> </xsl:for-each> </TABLE> </BODY> </HTML> </xsl:template> </xsl:stylesheet>
Do zdefiniowania zależności pomiędzy danymi z dwóch tabel (państw i miast) wykorzystano wyrażenie XPath z predykatem odwołującym się do wartości zmiennej kraj.
Ten sam cel można byłoby osiągnąć wykorzystując znacznik <xsl:key> oraz funkcję key().