0

私は XSLT 1.0 の初心者です。XSLT を使用して XML を XML に変換しています。受信した XML から最初の 5 つの一意の航空会社を取得したいと考えています。

ソース XML:

<Response>
    <Flights>
        <Flight>
            <Segments>
                <Segment>
                    <Airline>AB</Airline>
                </Segment>
            </Segments>
        </Flight>
        <Flight>
            <Segments>
                <Segment>
                    <Airline>CD</Airline>
                </Segment>
            </Segments>
        </Flight>
        <Flight>
            <Segments>
                <Segment>
                    <Airline>EF</Airline>
                </Segment>
            </Segments>
        </Flight>
        <Flight>
            <Segments>
                <Segment>
                    <Airline>EF</Airline>
                </Segment>
            </Segments>
        </Flight>
        <Flight>
            <Segments>
                <Segment>
                    <Airline>EF</Airline>
                </Segment>
            </Segments>
        </Flight>
        <Flight>
            <Segments>
                <Segment>
                    <Airline>EF</Airline>
                </Segment>
            </Segments>
        </Flight>
        <Flight>
            <Segments>
                <Segment>
                    <Airline>SD</Airline>
                </Segment>
            </Segments>
        </Flight>
    </Flights>
    <OtherRecommens>
        <RecommFlight>
            <Airline>XY</Airline>
        </RecommFlight>
        <RecommFlight>
            <Airline>ZZ</Airline>
        </RecommFlight>
        <RecommFlight>
            <Airline>XY</Airline>
        </RecommFlight>
        <RecommFlight>
            <Airline>AB</Airline>
        </RecommFlight>
    </OtherRecommens>
</Response>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output method="xml" indent="yes" />

    <xsl:template match="Response">
        <xsl:element name="Root">
            <xsl:variable name="Airlines" select="//Airline"/>
            <xsl:for-each select="$Airlines">
                <xsl:if test="not(preceding::Airline[.=current()/text()])">
                    <xsl:element name="SpecificAirline">
                        <xsl:value-of select="text()"/>
                    </xsl:element>
                </xsl:if>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

上記の XSLT を適用すると、以下の出力が得られます。

出力:

<Root>
  <SpecificAirline>AB</SpecificAirline>
  <SpecificAirline>CD</SpecificAirline>
  <SpecificAirline>EF</SpecificAirline>
  <SpecificAirline>SD</SpecificAirline>
  <SpecificAirline>XY</SpecificAirline>
  <SpecificAirline>ZZ</SpecificAirline>
</Root>

私の要件によれば、最初の5つの航空会社だけを取得する必要があります

期待される出力:

<Root>
  <SpecificAirline>AB</SpecificAirline>
  <SpecificAirline>CD</SpecificAirline>
  <SpecificAirline>EF</SpecificAirline>
  <SpecificAirline>SD</SpecificAirline>
  <SpecificAirline>XY</SpecificAirline>
</Root>

助けてください。ありがとう。

4

1 に答える 1

1

ここで説明するグループ化を使用しました: how to apply group by on xslt elements

5 >= position()ここで説明されている配列インデックスの制限: http://www.w3schools.com/xpath/xpath_functions.asp#context

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output method="xml" indent="yes" />

    <xsl:key name="airlinetext" match="Airline" use="text()" />

    <xsl:template match="Response">
        <xsl:element name="Root">
            <xsl:apply-templates select="(//Airline[generate-id(.)=generate-id(key('airlinetext',text())[1])])[5&gt;=position()]"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="Airline">
                <xsl:element name="SpecificAirline">
                    <xsl:value-of select="text()"/>
                </xsl:element>
    </xsl:template>

</xsl:stylesheet>
于 2012-11-29T09:53:23.427 に答える