0

注文価格の合計を追加して、XMLをある形式から別の形式に変換する必要があります。計算はSum total (itemPrice*itemQty)です。私のリクエスト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>
                   <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>

広告の追加を計算した後、これを以下の形式に変換する必要がありますか?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>
4

2 に答える 2

1

XSLT2.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>
于 2013-02-18T08:40:56.497 に答える
0

質問にXSLT2.0のタグを付けました。これは、合計を行うのが簡単であることを意味します。リターン要素に配置されていると仮定すると、これを実行してordertotalを取得するだけです。

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

他のすべての要素は、XSLTID変換を使用して単純にコピーされます。

これが完全な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、2番目の要素が52の注文になります。

于 2013-02-18T08:40:17.260 に答える