0

名前に一致する平面のリストを取得しようとしていますが、XMLでは平面が2回存在し、リストではHTMLで2回出力されていますが、1回だけ表示するにはどうすればよいですか?飛行機にID番号を割り当てているので、繰り返す飛行機は同じID番号になります。

XMLは次のとおりです。

<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 330</name>
        <speed>567</speed>
        <registereddate>07-06-10</registereddate>
    </plane>

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

    <route>
    <routename>Fiumicino-Dubai</routename>
    <course bearing="degrees">154 degrees</course>
    <distance type="miles">2697 miles</distance> 
    <duration>PT5H30M</duration>

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

</flight>


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

    <plane planeid="1">
        <name>Airbus 330</name>
            <speed>567</speed>
        <registereddate>06-12-97</registereddate>
    </plane>


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

    <route>
        <routename>London-L.A</routename>
        <course bearing="degrees">154 degrees</course>
        <distance type="miles">5441 miles</distance> 
        <time>PT11H5M</time>
        <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 Intl</airport>
            <country>USA</country>
            <city>L.A</city>
            <latitude>33.9471</latitude>
            <longitude>-118.4082</longitude>
        </to>
    </route>

</flight>

</flights> 

Xpathは次のとおりです。

    <xsl:element name="ul">
            <xsl:attribute name="style">
                <xsl:text>width:100px; margin:0 auto; padding: 0;</xsl:text>
            </xsl:attribute>
                <xsl:for-each select="flights/flight"> 
                    <xsl:apply-templates select="plane" />
                </xsl:for-each> 
        </xsl:element>


<xsl:template match="plane">
    <xsl:element name="li">
        <xsl:attribute name="style">
            <xsl:text>list-style-type:none; width:100px; margin:0 auto;  margin-top: 20px;</xsl:text>
        </xsl:attribute>
        <a><xsl:attribute name="href">aircraft.php?a=<xsl:value-of select="name" /></xsl:attribute>
            <xsl:value-of select="name" />
        </a>
    </xsl:element>
</xsl:template>
4

1 に答える 1

2

これを実現するには、「Muenchiangrouping」トリックを使用できます。トップレベルでキーを定義します。

<xsl:key name="planeById" match="plane" use="@planeid"/>

その後、代わりに

<xsl:for-each select="flights/flight"> 
  <xsl:apply-templates select="plane" />
</xsl:for-each>

言うだけ

<xsl:apply-templates select="flights/flight/plane[generate-id() =
    generate-id(key('planeById', @planeid)[1])]"/>

これには、plane各平面IDを持つ最初の平面要素にのみテンプレートを適用する効果があります。

于 2013-02-16T14:53:59.160 に答える