使用XSLT和XML创建HTML表格,选择一组特定的元素?

问题描述:

我需要在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文件,而不是对包含文本进行硬编码,我可以将它传递给一个参数,但到目前为止,我只想知道如何回答这个问题。

你没有说如果可以有多个具有相同标识符的路由名。如果有的话,它们应该显示在同一个表格或不同的表格中(每个匹配一个)?

我在这里假设,如果有多个具有相同标识符的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