2012-12-28 61 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

对不起,如果您想通过一条腿跳到达北极,您可能会发现这是一个有趣的挑战,但我没有。 –