当我是一个直接的XPath查询时,我可以在XSLT中创建一个列表,但是当我想创建一个名称=某个东西的所有子元素的列表时,我无法让它工作。这是我的XML:
<?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</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>UAE</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>
我想创建一个无序列表,其中包含与空客相等的平面/名称节点的子元素文本。这是我在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="ul">
<xsl:attribute name="style">
<xsl:text>width:100px; margin:0 auto; padding: 0;</xsl:text>
</xsl:attribute>
<xsl:apply-templates select="flights/flight/plane[name='Airbus']">
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template match="name">
<xsl:element name="li">
<xsl:attribute name="style">
<xsl:text>list-style-type:none; width:100px; margin:0 auto;</xsl:text>
</xsl:attribute>
<xsl:value-of select="name" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
所以结果将是这样的:
Name: Airbus
Registered Date: 07-06-10
有人能告诉我出错的地方吗?
答案 0 :(得分:1)
首先,您应该了解“文字结果元素”和“属性值模板”是什么。它们将使您的XSLT代码更加简洁。
要回答您的问题:您的代码无效,因为您在apply-templates
元素上调用了plane
,但其模板符合name
元素。尝试匹配plane
元素的模板:
<xsl:template match="/">
<html>
<head>
<title>flights</title>
</head>
<body>
<ul style="width:100px; margin:0 auto; padding: 0;">
<xsl:apply-templates select="flights/flight/plane[name='Airbus']"/>
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="plane">
<li style="list-style-type:none; width:100px; margin:0 auto;">
<xsl:value-of select="name"/>
</li>
</xsl:template>