2013-02-18 57 views
0

我需要通过添加订单价格总和来将我的XML从一种格式转换为另一种格式。计算结果为Sum total (itemPrice*itemQty)。我的要求是XML如下XSLT转换。乘以然后总和

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
     <soap:Body> 
      <ns2:fetchOrderListResponse xmlns:ns2="http://impl.lob.xyz.com/"> 
      <return> 
       <customerOrderNumber>1</customerOrderNumber> 
       <orderDetails> 
        <itemPrice>2.0</itemPrice> 
    <itemQty>1</itemQty> 
        <orderDetailsId>37516016-D71B-4790-951F-55D00B0CC159</orderDetailsId> 
       </orderDetails> 
       <orderDetails> 
        <itemPrice>5.0</itemPrice> 
        <itemQty>3</itemQty> 
        <itemUnit>0</itemUnit> 
       </orderDetails> 
       <orderId>84EC371D-40CA-455E-A0FA-7EA733E9BFD3</orderId> 
      </return> 
      <return> 
       <customerOrderNumber>1</customerOrderNumber> 
       <deliverydate>2013-02-06T00:00:00+05:30</deliverydate> 
       <orderDetails> 
        <itemPrice>7.0</itemPrice> 
        <itemQty>1</itemQty> 
        <orderDetailsId>9A5030BE-F95F-4C62-B5A2-41FF85423218</orderDetailsId> 
       </orderDetails> 
       <orderDetails> 
        <itemPrice>9.0</itemPrice> 
        <itemQty>5</itemQty> 
        <orderDetailsId>65A8B3BE-D407-43D8-8754-EA1E26AA56E4</orderDetailsId> 
       </orderDetails> 
       <orderId>0BDCB222-0117-47A9-8813-DF03A1D19E5E</orderId> 
      </return> 
      </ns2:fetchOrderListResponse> 
     </soap:Body> 
    </soap:Envelope> 

我需要calucluating广告加入后,这个转换到下面的格式?元素使用XSLT。转换后的XML应如下所示。请在这里协助。

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <ns2:fetchOrderListResponse xmlns:ns2="http://impl.lob.xyz.com/"> 
     <return> 
      <customerOrderNumber>1</customerOrderNumber> 
      <orderDetails> 
       <itemPrice>2.0</itemPrice> 
       <itemQty>1</itemQty> 
       <orderDetailsId>37516016-D71B-4790-951F-55D00B0CC159</orderDetailsId> 
      </orderDetails> 
      <orderDetails> 
       <itemPrice>5.0</itemPrice> 
       <itemQty>3</itemQty> 
      </orderDetails> 
      <orderId>84EC371D-40CA-455E-A0FA-7EA733E9BFD3</orderId> 
      **<ordertotal>17.0</ordertotal>** 
     </return> 
     <return> 
      <customerOrderNumber>1</customerOrderNumber> 
      <deliverydate>2013-02-06T00:00:00+05:30</deliverydate> 
      <orderDetails> 
       <itemPrice>7.0</itemPrice> 
       <itemQty>1</itemQty> 
       <orderDetailsId>9A5030BE-F95F-4C62-B5A2-41FF85423218</orderDetailsId> 
      </orderDetails> 
      <orderDetails> 
       <itemPrice>9.0</itemPrice> 
       <itemQty>5</itemQty> 
       <orderDetailsId>65A8B3BE-D407-43D8-8754-EA1E26AA56E4</orderDetailsId> 
      </orderDetails> 
      <orderId>0BDCB222-0117-47A9-8813-DF03A1D19E5E</orderId> 
      **<ordertotal>52.0</ordertotal>** 
     </return> 
     </ns2:fetchOrderListResponse> 
    </soap:Body> 
</soap:Envelope> 
+0

在哪里你的XSLT? – Torious 2013-02-18 07:27:18

+0

首先尝试一下:http://www.dpawson.co.uk/xsl/sect2/N1930.html#d3155e175 – rene 2013-02-18 07:34:09

回答

1

的XSLT 2.0的解决办法是:

<xsl:stylesheet version="2.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes" /> 

    <!-- Identity template : elements and attributes are copied by default --> 
    <xsl:template match="*|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="*|@*" /> 
     </xsl:copy> 
    </xsl:template> 

    <!-- When matching return we add the order total as its last child --> 
    <xsl:template match="return"> 
     <xsl:copy> 
      <xsl:copy-of select="@*|*" /> 
      <ordertotal> 
       <xsl:value-of select="sum(orderDetails/(itemPrice*itemQty))" /> 
      </ordertotal> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

如果使用XSLT 1.0(没有扩展功能),你必须使用递归来实现你想要的:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes" /> 

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

    <xsl:template match="return"> 
     <xsl:copy> 
      <xsl:copy-of select="@*|*" /> 
      <ordertotal><xsl:call-template name="calculate-total" /></ordertotal> 
     </xsl:copy> 
    </xsl:template> 

    <!-- Recursive template --> 
    <xsl:template name="calculate-total"> 
     <!-- Select by default the set of orderDetails from the current context --> 
     <xsl:param name="orderDetails" 
        select="orderDetails" /> 
     <!-- Param which is going to keep track of the result step by step --> 
     <xsl:param name="total" 
        select="'0'" /> 

     <xsl:choose> 
      <!-- If we have remaining order details, recurse --> 
      <xsl:when test="$orderDetails"> 
       <xsl:call-template name="calculate-total"> 
        <!-- Remove the current element for the next step --> 
        <xsl:with-param name="orderDetails" 
            select="$orderDetails[position() > 1]" /> 
        <!-- Do the partial operation for the current element, and continue to the next step --> 
        <xsl:with-param name="total" 
            select="$total + ($orderDetails[1]/itemPrice * $orderDetails[1]/itemQty)" /> 
       </xsl:call-template>   
      </xsl:when> 
      <!-- Output the result --> 
      <xsl:otherwise> 
       <xsl:value-of select="$total" /> 
      </xsl:otherwise> 
     </xsl:choose> 

    </xsl:template> 

</xsl:stylesheet> 
0

您已经标记了问题XSLT2.0,这意味着它是直着做加法。假设你定位在回报元素上,你只会做这个拿到的OrderTotal

<ordertotal> 
    <xsl:value-of select="sum(orderDetails/(itemPrice * itemQty))"/> 
</ordertotal> 

所有其他元素将简单地由XSLT转换身份的方式进行复制。

以下是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="return"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <ordertotal> 
      <xsl:value-of select="sum(orderDetails/(itemPrice * itemQty))"/> 
     </ordertotal> 
     </xsl:copy> 
    </xsl:template> 

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

这应该给你一个订单总量的17第一回报元素,以及52为第二。