0

以下の 2 つの ASNInPO の po_nbr は同じですが、ASNInCtn の下の container_id は同じで、ASNInItem の下の item_id は異なります。この場合、2 つの ASNInPO をマージし、2 つの ASNInCtn を 1 つのタグにマージする必要があります。これは私の入力です:

     <?xml version = '1.0' encoding = 'UTF-8'?>
 <ASNInDesc>
    <asn_nbr>ASN-1</asn_nbr>
    <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>
  </ASNInDesc>

これは望ましい出力です:

<?xml version = '1.0' encoding = 'UTF-8'?>
 <ASNInDesc>
    <asn_nbr>ASN-1</asn_nbr>
    <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>
 </ASNInDesc>

これを解決するのを手伝ってください。

4

1 に答える 1

0

この質問は でタグ付けされているため、 Muenchian グループ化xslt-1.0方法を使用して XSLT 1.0 ソリューションを投稿します。(おそらく他の誰かが XSLT 2.0 ソリューションに貢献するでしょう。それらを比較することは有益かもしれません。)

スタイルシートについて見ていきましょう。

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

グループ化 1:ASNInPO要素po_nbr

ASNInPO要素を でグループ化したいので 、値で要素を取得できるようにするキーpo_nbrを定義することから始めましょう。ASNInPOpo_nbr

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

次に、に一致するテンプレートを作成しますASNInDesc。要素のコピーを作成し、そのasn_nbr. ここで、含まれているASNInPO要素をそのpo_nbr. これを行うには、各グループの最初のテンプレートにテンプレートを適用します。 ASNInPo

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

グループ化 2:ASNInCtn要素container_id

しかし、先に進む前に、別のキーを定義する必要があります。ASNInCtn要素ごとにグループ化する必要があるようですcontainer_id(そうでない場合は、以下の注を参照してください)。

  <xsl:key name="ASNInCtn-by-container_id" 
           match="ASNInCtn" use="container_id"/>

ASNInPO 要素に一致する次のテンプレートでそのキーが必要になります。ここで処理する要素は、上記の要素のみを選択したため、グループの最初の要素になることに注意してください xsl:apply-template

このテンプレートは、上で書いたものと似ています。要素と一緒に要素自体のコピーを作成し、それらによってグループ化された最初の要素に po_nbrテンプレートを再度適用します。ASNInCtncontainer_id

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

最後に、ASNInCtn要素に一致するテンプレートを作成します。これにより、要素自体がコピーされ、次に同じグループcontainer_id内のすべての ASNInItem要素がコピーされます。

  <xsl:template match="ASNInCtn">
    <xsl:copy>
      <xsl:copy-of select="container_id"/>
      <xsl:copy-of select="key('ASNInCtn-by-container_id', 
                               container_id)/ASNInItem"/>
    </xsl:copy>
  </xsl:template>

これで完了です。

</xsl:stylesheet>

ノート

ASNInCtnこのソリューションでは、指定 されたを持つ要素は、同じ を持つ要素 container_id内にのみ出現できると想定しています。そうでない場合は、 との組み合わせを使用するようにオブジェクトのキーを調整する必要があります。ASNInPOpo_nbrASNInPOpo_nbrcontainer_id

于 2012-08-02T05:47:14.407 に答える