2014-04-07 4 views
0

2 개의 데이터 소스 (요청 및 실제)가 있습니다. 다음은 내 XML의 샘플입니다XSLT 1.0 - 2 노드의 조건에 기반한 열 합계

<dsQuery Response> 
    <Request> 
    <Rows> 
     <Row> 
     <TravelDate>2013-10-05T05:00:00Z</TravelDate> 
     <ID>1</ID> 
     <Cost>1000</Cost> 
    </Row> 
    <Row> 
     <TravelDate>2013-12-31T05:00:00Z</TravelDate> 
     <ID>2</ID 
     <Cost>2500</Cost> 
    </Row> 
    <Row> 
     <TravelDate>2014-01-13T06:00:00Z</TravelDate> 
     <ID>3</ID> 
     <Cost>1300</Cost> 
    </Row> 
    <Row> 
     <TravelDate>2014-02-01T06:00:00Z</TravelDate> 
     <ID>4</ID> 
     <Cost>2300</Cost> 
    </Row> 
    <Row> 
     <TravelDate>2014-08-01T06:00:00Z</TravelDate> 
     <ID>5</ID> 
     <Cost>2000</Cost> 
    </Row> 
    </Rows> 
    </Request> 
    <Actual> 
    <Rows> 
     <Row> 
     <ID>10</ID> 
     <FormID>2</FormID> 
     <CheckDate>2014-01-01T12:00:00Z</CheckDate> 
     </Row> 
     <Row> 
     <ID>11</ID> 
     <FormID>3</FormID> 
     <CheckDate>2014-01-31T12:00:00Z</CheckDate> 
    </Row> 
    <Row> 
     <ID>12</ID> 
     <FormID>4</FormID> 
     <CheckDate>2014-02-15T12:00:00Z</CheckDate> 
    </Row> 
    </Rows> 
</Actual> 
</dsQuery Response> 

나는 비용 열을 합계 할 필요가 경우 CheckDate = 올해의 올해 TravelDate = 올해 OR 경우 년.

위의 시나리오에서 요청 ID 2-5는 기준을 충족합니다. 합계는 8100이어야합니다. 나는 합계를 얻는 몇 가지 방법을 시도했지만 아무도 작동하지 않습니다. 어떤 도움을 주셔서 감사합니다.

+0

'은 ' 2013-12-31T05 : 00 :'입니다. 올해는 아닙니다. – deanosaur

+0

입력 XML 예제를 수정하십시오 :''는 유효한 요소 이름이 아니며 11 번째 줄에 열린 태그가 있습니다. –

답변

0

당신은 필터링 된 요소를 보유 할 xsl:variable를 사용하고이를 더할 수 :

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml"/> 
    <xsl:template match="/dsQueryResponse"> 

     <xsl:variable name="ThisYear" select="2014" /> 
     <xsl:variable name="Rows"> 
      <xsl:for-each select="//Cost"> 
       <xsl:variable name="ID" select="../ID" /> 
       <xsl:if test=" 
        starts-with(../TravelDate, $ThisYear) or 
        (
         /*/Actual/*/*[FormID = $ID and 
         starts-with(CheckDate, $ThisYear) ] 
        )"> 
        <xsl:copy-of select=".." /> 
       </xsl:if> 
      </xsl:for-each> 
     </xsl:variable> 

     <xsl:value-of select="sum($Rows//Cost)" /> 

    </xsl:template> 
</xsl:stylesheet> 
+0

XSLT 1.0에서 결과 트리 단편을 합칠 수 없습니다. –

0

이 뜻을 출력 <sum>5600</sum>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="year" select="string('2014')"/> 

    <xsl:template match="/"> 
     <sum> 
     <xsl:value-of select="sum(//Request/Rows/Row[substring-before(TravelDate/text(),'-')=$year]/Cost) 
        + sum(//Actual/Rows/Row[substring-before(CheckDate,'-')=$year]/Cost)"/> 
     </sum> 

    </xsl:template> 
</xsl:stylesheet> 
+0

'실제'행에는'Cost' 엘리먼트가 포함되어 있지 않습니다 –

+0

@RubensFarias 샘플 xml에는 true로 표시되어 있습니다 만, '나는 TravelDate의 올해가 올해 =이거나 올해의 CheckDate = 올해는'CheckDate'에'Cost' 칼럼이있을 수 있다는 뜻이다. – deanosaur

0

당신은 XSLT 1.0 솔루션을 요구하지 않습니다,하지만이 있습니다 XSLT 1.0의 "올해"; EXSLT 확장 함수를 사용하거나 런타임에 현재 날짜/연도를 매개 변수로 전달해야합니다.

그 외. 에 적용하면

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:date="http://exslt.org/dates-and-times" 
extension-element-prefixes="date"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:param name="thisYear" select="substring(date:date-time(), 1, 4)" /> 

<xsl:key name="check" match="CheckDate" use="../FormID" /> 

<xsl:template match="/"> 
    <sum> 
     <xsl:value-of select="sum(dsQueryResponse/Request/Rows/Row[substring(TravelDate, 1, 4)=$thisYear or substring(key('check',ID) , 1, 4)=$thisYear]/Cost)"/> 
    </sum> 
</xsl:template> 

</xsl:stylesheet> 

예를 입력 수정 : : 난 당신이 "관련"실제 checkdate에서 데이터를 얻을 수있는 를 사용하는 것이 좋습니다

<dsQueryResponse> 
    <Request> 
    <Rows> 
     <Row> 
     <TravelDate>2013-10-05T05:00:00Z</TravelDate> 
     <ID>1</ID> 
     <Cost>1000</Cost> 
    </Row> 
    <Row> 
     <TravelDate>2013-12-31T05:00:00Z</TravelDate> 
     <ID>2</ID> 
     <Cost>2500</Cost> 
    </Row> 
    <Row> 
     <TravelDate>2014-01-13T06:00:00Z</TravelDate> 
     <ID>3</ID> 
     <Cost>1300</Cost> 
    </Row> 
    <Row> 
     <TravelDate>2014-02-01T06:00:00Z</TravelDate> 
     <ID>4</ID> 
     <Cost>2300</Cost> 
    </Row> 
    <Row> 
     <TravelDate>2014-08-01T06:00:00Z</TravelDate> 
     <ID>5</ID> 
     <Cost>2000</Cost> 
    </Row> 
    </Rows> 
    </Request> 
    <Actual> 
    <Rows> 
     <Row> 
     <ID>10</ID> 
     <FormID>2</FormID> 
     <CheckDate>2014-01-01T12:00:00Z</CheckDate> 
     </Row> 
     <Row> 
     <ID>11</ID> 
     <FormID>3</FormID> 
     <CheckDate>2014-01-31T12:00:00Z</CheckDate> 
    </Row> 
    <Row> 
     <ID>12</ID> 
     <FormID>4</FormID> 
     <CheckDate>2014-02-15T12:00:00Z</CheckDate> 
    </Row> 
    </Rows> 
</Actual> 
</dsQueryResponse> 

을 한 결과는 다음과 같습니다

<?xml version="1.0" encoding="UTF-8"?> 
<sum>8100</sum>