XSLT 1.0 получить набор узлов

я новичок в XSLT. Я использую XSLT для преобразования XML в XML через JDK 6.

Ниже приведен исходный 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>

Проблема в логике создания переменной 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>

Есть ли доступная функция, с помощью которой я могу получить набор узлов вместо одного значения? Пожалуйста помоги.


person Ankur Raiyani    schedule 28.12.2012    source источник


Ответы (1)


Если вы используете Java, тогда вам доступен XSLT 2.0 (в форме Saxon), так что на самом деле очень мало смысла бороться с ограничениями XSLT 1.0 и расширениями вроде exslt:node-set(). которые были разработаны, чтобы обойти эти ограничения.

person Michael Kay    schedule 28.12.2012
comment
Спасибо за предложение. Однако здесь мы должны использовать XSLT 1.0, потому что мы не стремимся изменить технологию. Поэтому, пожалуйста, предложите какое-нибудь решение для XSLT 1.0. - person Ankur Raiyani; 01.01.2013
comment
Извините, если вы хотите добраться до Северного полюса, прыгая на одной ноге, вы можете найти это интересным испытанием, но не я. - person Michael Kay; 03.01.2013