Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 0
  • 49

W jaki sposób korzystając z XSLT stworzyć kwerendę łączącą dane z dwóch tabel zamodelowanych w XML?

  • Zapytał
  • @ | 13.12.2015
  • TRENER MODERATOR ALTKOM AKADEMII
Zaloguj się aby zadać pytanie
Pokrewne

Odpowiedź (1)

  • 0

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().

  • Odpowiedział
  • @ | 13.12.2015
  • TRENER MODERATOR ALTKOM AKADEMII