2013-02-14 131 views
1

我需要在HTML中從XSLT文件創建一個表格,但只選擇特定的一組節點。例如在下面的XML我想從和子節點選擇所有的地方routename包含FCO-DXB:使用XSLT和XML創建HTML表格,選擇一組特定的元素?

<?xml version="1.0" encoding="UTF-8"?> 

<flights 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="flights.xsd"> 

<flight flightid="1"> 
    <flightno>EK98</flightno> 
    <callsign>UAE98</callsign> 
    <airline>Emirates Airline</airline> 

    <plane planeid="1"> 
     <name>Airbus A380-861</name> 

     <registereddate>07-06-10</registereddate> 
    </plane> 


    <registration>3A6-EDJ</registration> 
    <altitude height="feet">41000</altitude> 
    <speed ratio="mph">564</speed> 
    <distance unit="miles">erf</distance> 

    <route> 
    <routename>FCO-DXB</routename> 
     <from> 
      <iatacode>FCO</iatacode> 
      <airport>Fiumicino</airport> 
      <country>Italy</country> 
      <city>Rome</city> 
      <latitude>41.8044</latitude> 
      <longitude>12.2508</longitude> 
     </from> 

     <to> 
      <iatacode>DXB</iatacode> 
      <airport>Dubai Intl</airport> 
      <country>United Arab Emirates</country> 
      <city>Dubai</city> 
      <latitude>25.2528</latitude> 
      <longitude>55.3644</longitude> 
     </to> 
    </route> 

    <course bearing="degrees">154</course> 

    <journey> 
     <distance type="miles">2,697</distance> 
     <time>PT5H30M</time> 
    </journey> 

</flight> 


<flight flightid="2"> 
    <flightno>BA283</flightno> 
    <callsign>BAW283</callsign> 
    <airline>British Airways</airline> 

    <plane planeid="2"> 
     <name>Boeing 747-436</name> 
     <registereddate>06-12-97</registereddate> 
    </plane> 


    <registration>3A6-EDJ</registration> 
    <altitude height="feet">41000</altitude> 
    <speed ratio="mph">564</speed> 
    <distance unit="miles">erf</distance> 

    <route> 
    <routename>LHR-LAX</routename> 
     <from> 
      <iatacode>LHR</iatacode> 
      <airport>Heathrow</airport> 
      <country>England</country> 
      <city>London</city> 
      <latitude>51.4775</latitude> 
      <longitude>0.4614</longitude> 
     </from> 

     <to> 
      <iatacode>LAX</iatacode> 
      <airport>Los Angeles International</airport> 
      <country>United States of America</country> 
      <city>L.A</city> 
      <latitude>33.9471</latitude> 
      <longitude>-118.4082</longitude> 
     </to> 
    </route> 

    <course bearing="degrees">154</course> 

    <journey> 
     <distance type="miles">5,441 miles</distance> 
     <time>PT11H5M</time> 
    </journey> 

</flight> 




</flights> 

,並在表輸出這個,這是我在XSLT嘗試:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" omit-xml-declaration="yes" /> 

    <xsl:template match="/"> 
    <xsl:element name="html"> 
     <xsl:element name="head"> 
      <xsl:element name="title">flights</xsl:element> 
     </xsl:element> 


    <xsl:element name="body"> 
     <xsl:element name="table"><xsl:attribute name="border">1</xsl:attribute> 
     <xsl:element name="tr"> 
      <xsl:element name="td"> 
      <xsl:element name="b">Title</xsl:element> 
      </xsl:element> 
      <xsl:element name="td"> 
      <xsl:element name="b">Artist</xsl:element> 
      </xsl:element> 
      <xsl:element name="td"> 
      <xsl:element name="b">Year</xsl:element> 
      </xsl:element> 
     </xsl:element> 
     <xsl:apply-templates select="flights/flight/route[contains(text(), 'FCO-DXB')]" /> 
     </xsl:element> 
    </xsl:element> 
</xsl:element> 
</xsl:template> 


<xsl:template match="from"> 
<xsl:element name="tr"> 
    <xsl:element name="td"><xsl:value-of select="iatacode"/></xsl:element> 
    <xsl:element name="td"><xsl:value-of select="airport"/></xsl:element> 
    <xsl:element name="td"><xsl:value-of select="country"/></xsl:element> 
    <xsl:element name="td"><xsl:value-of select="city"/></xsl:element> 
</xsl:element> 
</xsl:template> 

<xsl:template match="to"> 
<xsl:element name="tr"> 
<xsl:element name="td"><xsl:value-of select="iatacode"/></xsl:element> 
    <xsl:element name="td"><xsl:value-of select="airport"/></xsl:element> 
    <xsl:element name="td"><xsl:value-of select="country"/></xsl:element> 
    <xsl:element name="td"><xsl:value-of select="city"/></xsl:element> 
</xsl:element> 
</xsl:template> 


</xsl:stylesheet> 

我的目標是最終弄清楚如何將參數傳遞給XSLT文件,而不是對包含文本進行硬編碼,我可以將它傳遞給一個參數,但到目前爲止,我只想知道如何回答這個問題。

回答

3

你沒有說如果可以有多個具有相同標識符的路由名。如果有的話,它們應該顯示在同一個表格或不同的表格中(每個匹配一個)?

我在這裏假設,如果有多個具有相同標識符的routenames,那些打印在同一個表格中(如果這個假設不正確,我會改變它)。

這是做你想要達到的一種方式:

<?xml version="1.0" encoding="utf-8" ?> 

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

<xsl:output method="html" omit-xml-declaration="yes" /> 

<xsl:param name="code" 
      select="'FCO-DXB'" /> 

<xsl:template match="/flights"> 
    <html> 
     <head> 
      <title>flights</title> 
     </head> 
     <body> 
      <xsl:apply-templates select="flight/route[routename/. = $code]" /> 
     </body> 
    </html> 
</xsl:template> 


<xsl:template match="route"> 
    <table> 
     <tr> 
      <td><b>IATA Code</b></td> 
      <td><b>Airport</b></td> 
      <td><b>Country</b></td> 
      <td><b>City</b></td> 
     </tr> 
     <xsl:apply-templates select="*" /> 
    </table> 
</xsl:template> 

<xsl:template match="from|to"> 
    <tr><xsl:apply-templates select="*" /></tr> 
</xsl:template> 

<xsl:template match="iatacode|airport|country|city"> 
    <td><xsl:value-of select="." /></td> 
</xsl:template> 

<xsl:template match="text()" /> 

</xsl:stylesheet> 
+0

謝謝您的回答。對不起,只有一個帶有該文本的routename。你的代碼做了我想做的事情,但是它創建了兩次表格標題,我希望所有信息都放在一個表格中,這可能嗎?非常感謝,你的代碼比我的代碼好很多! :) – deucalion0 2013-02-14 11:15:53

+0

這應該按預期工作。我還更新瞭解決方案以接受param,在解析XML(取決於XSLT處理器)之前,該值可由XSLT處理器設置。 – 2013-02-14 11:34:52

+0

謝謝,我會盡力的!我添加了完整的XML文件。基本上,我只想要一個包含所有來自數據和所選routename的數據的表。謝謝! – deucalion0 2013-02-14 11:37:53