0

サンプル xml のコメントに従ってください。必要なすべてが説明されています。出力 xml の各シーンを同じ順序で 3 つのシーンでチェックしています。

入力 XML

   <!-- In the below xml there will be one ASNInDesc with multiple ASNInPO's 
        and each ASNInPO contains one ASNInCtn and each ASNInCtn contains one ASNInItem -->

<ASNInDesc>
   <asn_nbr>ASN-1</asn_nbr>

   <!-- In the below two ASNInPO's po_nbr is same container_id under ASNInCtn is same and item_id under
        ASNInItem is same. In this case two ASNInPO's has to be merged and two ASNInCtn's has to be merged
        into one tag(since the container_id is same) and two ASNInItem's has to be merged into one tag and unit_qty is to be added  -->

   <ASNInPO>
      <po_nbr>PO-1</po_nbr>
      <ASNInCtn>
         <container_id>CONTAINER-1</container_id>
         <ASNInItem>
            <item_id>ITEM-1</item_id>
            <unit_qty>2</unit_qty>
         </ASNInItem>
      </ASNInCtn>
   </ASNInPO>
   <ASNInPO>
      <po_nbr>PO-1</po_nbr>
      <ASNInCtn>
         <container_id>CONTAINER-1</container_id>
         <ASNInItem>
            <item_id>ITEM-1</item_id>
            <unit_qty>2</unit_qty>
         </ASNInItem>
      </ASNInCtn>
   </ASNInPO>

   <!-- In the below two ASNInPO's po_nbr is same container_id under ASNInCtn is same and item_id under
        ASNInItem is different. In this case two ASNInPO's has to be merged and two ASNInCtn's has to be merged into one tag and
        two different ASNInItem's for the two different items  -->

    <ASNInPO>
      <po_nbr>PO-2</po_nbr>
      <ASNInCtn>
         <container_id>CONTAINER-2</container_id>
         <ASNInItem>
            <item_id>ITEM-2</item_id>
            <unit_qty>3</unit_qty>
         </ASNInItem>
      </ASNInCtn>
   </ASNInPO>
   <ASNInPO>
      <po_nbr>PO-2</po_nbr>
      <ASNInCtn>
         <container_id>CONTAINER-2</container_id>
         <ASNInItem>
            <item_id>ITEM-3</item_id>
            <unit_qty>3</unit_qty>
         </ASNInItem>
      </ASNInCtn>
   </ASNInPO>

   <!-- In the below two ASNInPO's po_nbr is same container_id under ASNInCtn is different and item_id under
        ASNInItem is different. In this case two ASNInPO's has to be merged into one tag with
        two different ASNInCtn's each having their own ASNInItem  -->

   <ASNInPO>
      <po_nbr>PO-3</po_nbr>
      <ASNInCtn>
         <container_id>CONTAINER-3</container_id>
         <ASNInItem>
            <item_id>ITEM-3</item_id>
            <unit_qty>2</unit_qty>
         </ASNInItem>
      </ASNInCtn>
   </ASNInPO>
   <ASNInPO>
      <po_nbr>PO-3</po_nbr>
      <ASNInCtn>
         <container_id>CONTAINER-4</container_id>
         <ASNInItem>
            <item_id>ITEM-3</item_id>
            <unit_qty>2</unit_qty>
         </ASNInItem>
      </ASNInCtn>
   </ASNInPO>

</ASNInDesc>

出力 XML

<?xml version = '1.0' encoding = 'UTF-8'?>
<ASNInDesc>
   <asn_nbr>ASN-1</asn_nbr>
  <!-- Scenerio-1 --> 
   <ASNInPO>
      <po_nbr>PO-1</po_nbr>
      <ASNInCtn>
         <container_id>CONTAINER-1</container_id>
         <ASNInItem>
            <item_id>ITEM-1</item_id>
            <unit_qty>4</unit_qty>
         </ASNInItem>        
      </ASNInCtn>
  </ASNInPO>
  <!-- Scenerio-2 -->  
  <ASNInPO>
      <po_nbr>PO-2</po_nbr>
      <ASNInCtn>
         <container_id>CONTAINER-2</container_id>
         <ASNInItem>
            <item_id>ITEM-2</item_id>
            <unit_qty>3</unit_qty>
         </ASNInItem>
         <ASNInItem>
            <item_id>ITEM-3</item_id>
            <unit_qty>3</unit_qty>
         </ASNInItem>        
      </ASNInCtn>
   </ASNInPO>
  <!-- Scenerio-3 -->   
   <ASNInPO>
      <po_nbr>PO-3</po_nbr>
      <ASNInCtn>
         <container_id>CONTAINER-3</container_id>
         <ASNInItem>
            <item_id>ITEM-3</item_id>
            <unit_qty>2</unit_qty>
         </ASNInItem>
      </ASNInCtn>
      <ASNInCtn>
         <container_id>CONTAINER-4</container_id>
         <ASNInItem>
            <item_id>ITEM-3</item_id>
            <unit_qty>2</unit_qty>
         </ASNInItem>
      </ASNInCtn>     
   </ASNInPO>

独自の xsl を試してみましたが、すべてのシーンを処理できませんでした。これを解決するのを手伝ってください。前もって感謝します。

4

1 に答える 1

0

これは、 Muenchianグループ化を使用したXSLT1.0スタイルシートです。これはあなたの他の質問に対する私の答えに基づいています。

これは同じアプローチですが、調整されたキーを使用して、要素自体のIDと親要素のIDの連結を使用して、グループ化する要素を検索します。たとえば、ASNInItem要素は次の連結キーを使用して検索されますconcat(../../po_nbr, '|', ../container_id, '|', item_id)。区切り文字の選択は重要ではありませんが、IDに表示されない文字を選択する必要があります。

また、単位数量の合計が追加されました。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

  <xsl:key name="ASNInPO" match="ASNInPO" 
           use="po_nbr"/>

  <xsl:key name="ASNInCtn" match="ASNInCtn" 
           use="concat(../po_nbr, '|', 
                       container_id)"/>

  <xsl:key name="ASNInItem" match="ASNInItem" 
           use="concat(../../po_nbr, '|', 
                       ../container_id, '|', 
                       item_id)"/>

  <xsl:template match="ASNInDesc">
    <xsl:copy>
      <xsl:copy-of select="asn_nbr"/>
      <xsl:apply-templates 
          select="ASNInPO[generate-id() =
                          generate-id(key('ASNInPO', 
                                          po_nbr)[1])]"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="ASNInPO">
    <xsl:copy>
      <xsl:copy-of select="po_nbr"/>
      <xsl:apply-templates 
          select="key('ASNInPO', po_nbr)/
                  ASNInCtn[generate-id() =
                           generate-id(key('ASNInCtn',
                                           concat(../po_nbr, '|', 
                                                  container_id))[1])]"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="ASNInCtn">
    <xsl:copy>
      <xsl:copy-of select="container_id"/>
      <xsl:apply-templates
          select="key('ASNInCtn',
                      concat(../po_nbr, '|', 
                             container_id))/
                  ASNInItem[generate-id() =
                            generate-id(key('ASNInItem', 
                                        concat(../../po_nbr, '|',
                                               ../container_id, '|',
                                               item_id))[1])]"/>
    </xsl:copy>
  </xsl:template>


  <xsl:template match="ASNInItem">
    <xsl:copy>
      <xsl:copy-of select="item_id"/>
      <unit_qty>
        <xsl:value-of 
            select="sum(key('ASNInItem', 
                        concat(../../po_nbr, '|', 
                               ../container_id, '|', 
                               item_id))/unit_qty)"/>
      </unit_qty>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
于 2012-08-03T05:09:21.070 に答える