2012-12-28 2 views
0

저는 XSLT에서 초보자입니다. XSLT를 사용하여 JDK 6을 통해 XML을 XML로 XML 변환합니다.XSLT 1.0 get node set

다음은 웹 서비스에서받은 소스 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에 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> 

내가 출력 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

죄송합니다. 한쪽 다리에서 뛰면서 북극에 접근하고 싶다면 흥미로운 도전이 될 수도 있지만 그렇지 않습니다. –