2013-10-24 2 views
0

저는 XSLT를 처음 사용합니다. 병합 및 추가 요구 사항이 있습니다.XML 레코드를 하나로 병합

XML 다음 LocationCode, DatePONumber 필드가 일치하면

<OrderDetails> 
    <OrderDetail action="add"> 
    <OrderedUnits>18</OrderedUnits> 
    <Date>2013-09-30T00:00:00</Date> 
    <LocationCode>3202</LocationCode> 
    <PONumber>022548295755</PONumber> 
    </OrderDetail> 
    <OrderDetail action="add"> 
    <OrderedUnits>12</OrderedUnits> 
    <Date>2013-09-30T00:00:00</Date> 
    <LocationCode>3202</LocationCode> 
    <PONumber>022548295755</PONumber> 
    </OrderDetail> 
    <IOrderDetail action="add"> 
    <OrderedUnits>18</OrderedUnits> 
    <Date>2013-09-30T00:00:00</Date> 
    <LocationCode>3202</LocationCode> 
    <PONumber>022548295762</PONumber> 
    </OrderDetail> 
<OrderDetails> 

, 내가 OrderedUnits를 추가하고 하나 개의 항목 만 확인해야합니다.

예상 출력 XML :

<OrderDetails> 
    <OrderDetail action="add"> 
    <OrderedUnits>30</OrderedUnits> 
    <Date>2013-09-30T00:00:00</Date> 
    <LocationCode>3202</LocationCode> 
    <PONumber>022548295755</PONumber> 
    </OrderDetail> 
    <IOrderDetail action="add"> 
    <OrderedUnits>18</OrderedUnits> 
    <Date>2013-09-30T00:00:00</Date> 
    <LocationCode>3202</LocationCode> 
    <PONumber>022548295762</PONumber> 
    </OrderDetail> 
<OrderDetails> 

가 어떻게이 XSLT를 작성할 수있다?

+0

무엇 XSLT 엔진을 사용하고 있습니까? – David

+0

XSLT 1.0 또는 2.0을 사용하고 있습니까? –

답변

0

어떨까요?

<?xml version="1.0" encoding="ISO-8859-1"?> 
<OrderDetails> 
    <OrderDetail action="add"> 
    <OrderedUnits>18</OrderedUnits> 
    <Date>2013-09-30T00:00:00</Date> 
    <LocationCode>3202</LocationCode> 
    <PONumber>022548295755</PONumber> 
    </OrderDetail> 

<OrderDetail action="add"> 
    <OrderedUnits>12</OrderedUnits> 
    <Date>2013-09-30T00:00:00</Date> 
    <LocationCode>3202</LocationCode> 
    <PONumber>022548295755</PONumber> 
    </OrderDetail> 
    <OrderDetail action="add"> 
    <OrderedUnits>18</OrderedUnits> 
    <Date>2013-09-30T00:00:00</Date> 
    <LocationCode>3202</LocationCode> 
    <PONumber>022548295762</PONumber> 
    </OrderDetail> 
</OrderDetails> 

결과 (tested in) : 당신이 버전을 지정하지 않은 많은 사람들이 그것을 이용해야하기 때문에

<?xml version="1.0" encoding="UTF-8"?> 
<OrderDetails> 
    <OrderDetail action="add"> 
     <OrderedUnits>30</OrderedUnits> 
     <Date>2013-09-30T00:00:00</Date> 
     <LocationCode>3202</LocationCode> 
     <PONumber>022548295755</PONumber> 
    </OrderDetail> 
    <OrderDetail action="add"> 
     <OrderedUnits>18</OrderedUnits> 
     <Date>2013-09-30T00:00:00</Date> 
     <LocationCode>3202</LocationCode> 
     <PONumber>022548295762</PONumber> 
    </OrderDetail> 
</OrderDetails> 
0

, 여기에 XSLT 2.0 옵션들

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" encoding="utf-8" indent="no" /> 
    <xsl:template match="/"> 
     <OrderDetails> 
     <xsl:for-each select="//OrderDetail"> 
      <xsl:variable name="this_date" select="Date" /> 
      <xsl:variable name="this_pon" select="PONumber" /> 
      <xsl:variable name="this_loc" select="LocationCode" /> 
      <xsl:variable name="all" select="count(//OrderDetail[Date = $this_date and PONumber = $this_pon and LocationCode = $this_loc]) " /> 
      <xsl:variable name="before" select="count(preceding-sibling::OrderDetail[Date = $this_date and PONumber = $this_pon and LocationCode = $this_loc]) " /> 
      <xsl:if test="$before + 1 = $all"> 
       <!-- we are in the last distinct order, display it --> 
       <OrderDetail action="add"> 
        <OrderedUnits> 
        <xsl:value-of select="sum(//OrderDetail[Date = $this_date and PONumber = $this_pon and LocationCode = $this_loc]/OrderedUnits)" /> 
        </OrderedUnits> 
        <Date> 
        <xsl:value-of select="Date" /> 
        </Date> 
        <LocationCode> 
        <xsl:value-of select="LocationCode" /> 
        </LocationCode> 
        <PONumber> 
        <xsl:value-of select="PONumber" /> 
        </PONumber> 
       </OrderDetail> 
      </xsl:if> 
     </xsl:for-each> 
     </OrderDetails> 
    </xsl:template> 
</xsl:stylesheet> 

는 XML을 수정.

XML 입력

<OrderDetails> 
    <OrderDetail action="add"> 
     <OrderedUnits>18</OrderedUnits> 
     <Date>2013-09-30T00:00:00</Date> 
     <LocationCode>3202</LocationCode> 
     <PONumber>022548295755</PONumber> 
    </OrderDetail> 
    <OrderDetail action="add"> 
     <OrderedUnits>12</OrderedUnits> 
     <Date>2013-09-30T00:00:00</Date> 
     <LocationCode>3202</LocationCode> 
     <PONumber>022548295755</PONumber> 
    </OrderDetail> 
    <OrderDetail action="add"> 
     <OrderedUnits>18</OrderedUnits> 
     <Date>2013-09-30T00:00:00</Date> 
     <LocationCode>3202</LocationCode> 
     <PONumber>022548295762</PONumber> 
    </OrderDetail> 
</OrderDetails> 

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="OrderDetails"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:for-each-group select="OrderDetail" group-by="string-join((Date,LocationCode,PONumber),'|')"> 
       <xsl:copy> 
        <xsl:apply-templates select="@*"/> 
        <xsl:for-each-group select="current-group()/*" group-by="name()"> 
         <xsl:apply-templates select="current-group()[1]"/> 
        </xsl:for-each-group> 
       </xsl:copy> 
      </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="OrderedUnits"> 
     <xsl:copy> 
      <xsl:value-of select="sum(current-group())"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

XML 출력

<OrderDetails> 
    <OrderDetail action="add"> 
     <OrderedUnits>30</OrderedUnits> 
     <Date>2013-09-30T00:00:00</Date> 
     <LocationCode>3202</LocationCode> 
     <PONumber>022548295755</PONumber> 
    </OrderDetail> 
    <OrderDetail action="add"> 
     <OrderedUnits>18</OrderedUnits> 
     <Date>2013-09-30T00:00:00</Date> 
     <LocationCode>3202</LocationCode> 
     <PONumber>022548295762</PONumber> 
    </OrderDetail> 
</OrderDetails> 
관련 문제