0

私は XSLT の初心者です。XSLT を使用して、JDK 6 を介して XML を XML に変換しています。

以下は、Web サービスから受け取ったソース XML です。

ソース XML:

<Response>
    <data>
        <route type="OUTBOUND">
            <Include>AA</Include>
            <Include>BB</Include>
            <Include>CC</Include>
        </route>
        <route type="INBOUND">
            <Include>XX</Include>
            <Include>YY</Include>
            <Include>ZZ</Include>
        </route>
    </data>
    <result>
        <Flights type="OUTBOUND">
            <Flight>
                <Airline>AA</Airline>
            </Flight>
            <Flight>
                <Airline>BB</Airline>
            </Flight>
            <Flight>
                <Airline>CC</Airline>
            </Flight>
            <Flight>
                <Airline>XX</Airline>
            </Flight>
            <Flight>
                <Airline>YY</Airline>
            </Flight>           
            <Flight>
                <Airline>ZZ</Airline>
            </Flight>
        </Flights>
        <Flights type="INBOUND">
            <Flight>
                <Airline>AA</Airline>
            </Flight>
            <Flight>
                <Airline>BB</Airline>
            </Flight>
            <Flight>
                <Airline>CC</Airline>
            </Flight>
            <Flight>
                <Airline>XX</Airline>
            </Flight>
            <Flight>
                <Airline>YY</Airline>
            </Flight>           
            <Flight>
                <Airline>ZZ</Airline>
            </Flight>
        </Flights>
    </result>
</Response>

XSLT:

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

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

    <xsl:template match="Response">
        <xsl:element name="Result">
            <xsl:apply-templates select="result/Flights"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="Flights">
        <xsl:variable name="PrefAirlines">
            <xsl:choose>
                <xsl:when test="current()/@type = 'OUTBOUND'">
                    <xsl:value-of select="//route[@type='OUTBOUND']/Include"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="//route[@type='INBOUND']/Include"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:apply-templates select="Flight[Airline=$PrefAirlines]"/>
    </xsl:template>

    <xsl:template match="Flight">
        <xsl:element name="FilterFlight">
            <xsl:value-of select="Airline"/>
        </xsl:element>
    </xsl:tempalte>

</xsl:stylesheet>

上記の XSLT をソース XML に適用すると、次の出力 XML が得られます。

出力XML:

<Result>
  <FilterFlight>AA</FilterFlight>
  <FilterFlight>XX</FilterFlight>
</Result>

期待される出力:

<Result>
  <FilterFlight>AA</FilterFlight>
  <FilterFlight>BB</FilterFlight>
  <FilterFlight>CC</FilterFlight>
  <FilterFlight>XX</FilterFlight>
  <FilterFlight>YY</FilterFlight>
  <FilterFlight>ZZ</FilterFlight>
</Result>

問題は variable を作成するロジック内にありますPrefAirlines

以下のアプローチも試しましたが、期待される出力が得られませんでした。

<xsl:variable name="PrefAirlines">
    <xsl:choose>
        <xsl:when test="current()/@type = 'OUTBOUND'">
            <xsl:value-of select="exslt:node-set(//route[@type='OUTBOUND']/Include)"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="exslt:node-set(//route[@type='INBOUND']/Include)"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

単一の値の代わりにノードセットを取得できる関数はありますか? 助けてください。

4

1 に答える 1

2

Java を使用している場合は、XSLT 2.0 を (Saxon の形式で) 利用できるため、XSLT 1.0 の制約や制限、および exslt:node-set() のような拡張機能に苦労してもほとんど意味がありません。これらの制限を回避するように設計されています。

于 2012-12-28T15:18:09.747 に答える