使用XSLT从Xpath查询创建无序列表

时间:2013-02-14 22:46:58

标签: xml xslt xpath

当我是一个直接的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

有人能告诉我出错的地方吗?

1 个答案:

答案 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>