2012-12-28 62 views
0

我是XSLT的初學者。我正在使用XSLT通過JDK 6將XML轉換爲XML。XSLT 1.0獲取節點集

以下是我從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。

OutputXML:

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

是否有任何可用的功能,我可以得到節點集而不是單個值? 請幫忙。

回答

2

如果您使用的是Java,那麼您可以使用XSLT 2.0(採用Saxon的形式),所以在掙扎於XSLT 1.0的限制和限制方面真的很少,而像exslt:node -set(),旨在解決這些限制。

+0

感謝您的建議。但是,在這裏我們必須使用XSLT 1.0,因爲它不是我們要求改變技術的。因此,請爲XSLT 1.0建議一些解決方案。 –

+1

對不起,如果您想通過一條腿跳到達北極,您可能會發現這是一個有趣的挑戰,但我沒有。 –