使用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>
谢谢您的回答。对不起,只有一个带有该文本的routename。你的代码做了我想做的事情,但是它创建了两次表格标题,我希望所有信息都放在一个表格中,这可能吗?非常感谢,你的代码比我的代码好很多! :) – deucalion0 2013-02-14 11:15:53
这应该按预期工作。我还更新了解决方案以接受param,在解析XML(取决于XSLT处理器)之前,该值可由XSLT处理器设置。 – 2013-02-14 11:34:52
谢谢,我会尽力的!我添加了完整的XML文件。基本上,我只想要一个包含所有来自数据和所选routename的数据的表。谢谢! – deucalion0 2013-02-14 11:37:53