-1

各 order_h の下に order_no に一致する order_h から複数の子ノード order_d を追加したいと考えています。

ここに私のxmlがあります

 <document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <order>
        <order_h owner="GD" order_no="421424" profoma_po="421425">
          <order_d owner="GD" item_no="100000014" line_no="1" order_no="421424" color_code="730" manufacturer="100783">
            <size assoc_id="69398" match_id="14" pack_code="BULK" size_range="2" model_name="SIZE SCALE 2" size_id="SIZE SCALE 2">
              <Size_b assoc_id="69398" row_no="0" pct_ratio="PCT" total_pct="100" priority="0" ship_pack="BULK">
                <size_d assoc_id="69398" ship_pack="BULK" ctn_sku="5602001" size_code="S" alloc_qty="26" plan_pct_ratio="34" row_no="0" sort_value="6"/>
              </Size_b>
              <Size_b assoc_id="69398" row_no="0" pct_ratio="PCT" total_pct="100" priority="0" ship_pack="BULK">
                <size_d assoc_id="69398" ship_pack="BULK" ctn_sku="5602182" size_code="L" alloc_qty="11" plan_pct_ratio="15" row_no="0" sort_value="8"/>
              </Size_b>
              <Size_b assoc_id="69398" row_no="0" pct_ratio="PCT" total_pct="100" priority="0" ship_pack="BULK">
                <size_d assoc_id="69398" ship_pack="BULK" ctn_sku="5602078" size_code="M" alloc_qty="21" plan_pct_ratio="27.5" row_no="0" sort_value="7"/>
              </Size_b>
              <Size_b assoc_id="69398" row_no="0" pct_ratio="PCT" total_pct="100" priority="0" ship_pack="BULK">
                <size_d assoc_id="69398" ship_pack="BULK" ctn_sku="5602060" size_code="XS" alloc_qty="18" plan_pct_ratio="23.5" row_no="0" sort_value="5"/>
              </Size_b>
            </size>
          </order_d>
    </order_h>
        <order_h owner="GD" order_no="421425" profoma_po="421425">
          <order_d owner="GD" item_no="100000014" line_no="3" order_no="421424" color_code="002" manufacturer="100783">
            <size assoc_id="69400" match_id="14" pack_code="BULK" size_range="2" model_name="SIZE SCALE 2" size_id="SIZE SCALE 2">
              <Size_b assoc_id="69400" row_no="0" pct_ratio="PCT" total_pct="100" priority="0" ship_pack="BULK">
                <size_d assoc_id="69400" ship_pack="BULK" ctn_sku="5602019" size_code="S" alloc_qty="17" plan_pct_ratio="34" row_no="0" sort_value="6"/>
              </Size_b>
              <Size_b assoc_id="69400" row_no="0" pct_ratio="PCT" total_pct="100" priority="0" ship_pack="BULK">
                <size_d assoc_id="69400" ship_pack="BULK" ctn_sku="5602238" size_code="M" alloc_qty="14" plan_pct_ratio="27.5" row_no="0" sort_value="7"/>
              </Size_b>
              <Size_b assoc_id="69400" row_no="0" pct_ratio="PCT" total_pct="100" priority="0" ship_pack="BULK">
                <size_d assoc_id="69400" ship_pack="BULK" ctn_sku="5602131" size_code="XS" alloc_qty="12" plan_pct_ratio="23.5" row_no="0" sort_value="5"/>
              </Size_b>
              <Size_b assoc_id="69400" row_no="0" pct_ratio="PCT" total_pct="100" priority="0" ship_pack="BULK">
                <size_d assoc_id="69400" ship_pack="BULK" ctn_sku="5602027" size_code="L" alloc_qty="8" plan_pct_ratio="15" row_no="0" sort_value="8"/>
              </Size_b>
            </size>
          </order_d>
        </order_h>
<order_h owner="GD" order_no="421424" profoma_po="421425">
          <order_d owner="GD" item_no="100000014" line_no="3" order_no="421424" color_code="002" manufacturer="100783">
            <size assoc_id="69400" match_id="14" pack_code="BULK" size_range="2" model_name="SIZE SCALE 2" size_id="SIZE SCALE 2">
              <Size_b assoc_id="69400" row_no="0" pct_ratio="PCT" total_pct="100" priority="0" ship_pack="BULK">
                <size_d assoc_id="69400" ship_pack="BULK" ctn_sku="5602019" size_code="S" alloc_qty="17" plan_pct_ratio="34" row_no="0" sort_value="6"/>
              </Size_b>
              <Size_b assoc_id="69400" row_no="0" pct_ratio="PCT" total_pct="100" priority="0" ship_pack="BULK">
                <size_d assoc_id="69400" ship_pack="BULK" ctn_sku="5602238" size_code="M" alloc_qty="14" plan_pct_ratio="27.5" row_no="0" sort_value="7"/>
              </Size_b>
              <Size_b assoc_id="69400" row_no="0" pct_ratio="PCT" total_pct="100" priority="0" ship_pack="BULK">
                <size_d assoc_id="69400" ship_pack="BULK" ctn_sku="5602131" size_code="XS" alloc_qty="12" plan_pct_ratio="23.5" row_no="0" sort_value="5"/>
              </Size_b>
              <Size_b assoc_id="69400" row_no="0" pct_ratio="PCT" total_pct="100" priority="0" ship_pack="BULK">
                <size_d assoc_id="69400" ship_pack="BULK" ctn_sku="5602027" size_code="L" alloc_qty="8" plan_pct_ratio="15" row_no="0" sort_value="8"/>
              </Size_b>
            </size>
          </order_d>
        </order_h>
    </order>
    </document>

そして、これは、以前の投稿から取得した、現在使用している xslt が必要です

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

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

 <xsl:template match="order_h"/>

 <xsl:template match="order_h[1]">
  <xsl:copy>
   <xsl:apply-templates select=
    "@*|node()|following-sibling::*/node()"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

期待される出力

<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <order>
      <order_h order_no="421424" owner="GD" profoma_po="421425">
         <order_d color_code="730" item_no="100000014" line_no="1" manufacturer="100783"
                  order_no="421424"
                  owner="GD">
            <size assoc_id="69398" match_id="14" model_name="SIZE SCALE 2" pack_code="BULK"
                  size_id="SIZE SCALE 2"
                  size_range="2">
               <Size_b assoc_id="69398" pct_ratio="PCT" priority="0" row_no="0" ship_pack="BULK"
                       total_pct="100">
                  <size_d alloc_qty="26" assoc_id="69398" ctn_sku="5602001" plan_pct_ratio="34"
                          row_no="0"
                          ship_pack="BULK"
                          size_code="S"
                          sort_value="6"/>
               </Size_b>
               <Size_b assoc_id="69398" pct_ratio="PCT" priority="0" row_no="0" ship_pack="BULK"
                       total_pct="100">
                  <size_d alloc_qty="11" assoc_id="69398" ctn_sku="5602182" plan_pct_ratio="15"
                          row_no="0"
                          ship_pack="BULK"
                          size_code="L"
                          sort_value="8"/>
               </Size_b>
               <Size_b assoc_id="69398" pct_ratio="PCT" priority="0" row_no="0" ship_pack="BULK"
                       total_pct="100">
                  <size_d alloc_qty="21" assoc_id="69398" ctn_sku="5602078" plan_pct_ratio="27.5"
                          row_no="0"
                          ship_pack="BULK"
                          size_code="M"
                          sort_value="7"/>
               </Size_b>
               <Size_b assoc_id="69398" pct_ratio="PCT" priority="0" row_no="0" ship_pack="BULK"
                       total_pct="100">
                  <size_d alloc_qty="18" assoc_id="69398" ctn_sku="5602060" plan_pct_ratio="23.5"
                          row_no="0"
                          ship_pack="BULK"
                          size_code="XS"
                          sort_value="5"/>
               </Size_b>
            </size>
         </order_d>
         <order_d color_code="002" item_no="100000014" line_no="3" manufacturer="100783"
                  order_no="421424"
                  owner="GD">
            <size assoc_id="69400" match_id="14" model_name="SIZE SCALE 2" pack_code="BULK"
                  size_id="SIZE SCALE 2"
                  size_range="2">
               <Size_b assoc_id="69400" pct_ratio="PCT" priority="0" row_no="0" ship_pack="BULK"
                       total_pct="100">
                  <size_d alloc_qty="17" assoc_id="69400" ctn_sku="5602019" plan_pct_ratio="34"
                          row_no="0"
                          ship_pack="BULK"
                          size_code="S"
                          sort_value="6"/>
               </Size_b>
               <Size_b assoc_id="69400" pct_ratio="PCT" priority="0" row_no="0" ship_pack="BULK"
                       total_pct="100">
                  <size_d alloc_qty="14" assoc_id="69400" ctn_sku="5602238" plan_pct_ratio="27.5"
                          row_no="0"
                          ship_pack="BULK"
                          size_code="M"
                          sort_value="7"/>
               </Size_b>
               <Size_b assoc_id="69400" pct_ratio="PCT" priority="0" row_no="0" ship_pack="BULK"
                       total_pct="100">
                  <size_d alloc_qty="12" assoc_id="69400" ctn_sku="5602131" plan_pct_ratio="23.5"
                          row_no="0"
                          ship_pack="BULK"
                          size_code="XS"
                          sort_value="5"/>
               </Size_b>
               <Size_b assoc_id="69400" pct_ratio="PCT" priority="0" row_no="0" ship_pack="BULK"
                       total_pct="100">
                  <size_d alloc_qty="8" assoc_id="69400" ctn_sku="5602027" plan_pct_ratio="15" row_no="0"
                          ship_pack="BULK"
                          size_code="L"
                          sort_value="8"/>
               </Size_b>
            </size>
         </order_d>
         </order_h>
         <order_h order_no="421425" owner="GD" profoma_po="421425">
         <order_d color_code="002" item_no="100000014" line_no="3" manufacturer="100783"
                  order_no="421424"
                  owner="GD">
            <size assoc_id="69400" match_id="14" model_name="SIZE SCALE 2" pack_code="BULK"
                  size_id="SIZE SCALE 2"
                  size_range="2">
               <Size_b assoc_id="69400" pct_ratio="PCT" priority="0" row_no="0" ship_pack="BULK"
                       total_pct="100">
                  <size_d alloc_qty="17" assoc_id="69400" ctn_sku="5602019" plan_pct_ratio="34"
                          row_no="0"
                          ship_pack="BULK"
                          size_code="S"
                          sort_value="6"/>
               </Size_b>
               <Size_b assoc_id="69400" pct_ratio="PCT" priority="0" row_no="0" ship_pack="BULK"
                       total_pct="100">
                  <size_d alloc_qty="14" assoc_id="69400" ctn_sku="5602238" plan_pct_ratio="27.5"
                          row_no="0"
                          ship_pack="BULK"
                          size_code="M"
                          sort_value="7"/>
               </Size_b>
               <Size_b assoc_id="69400" pct_ratio="PCT" priority="0" row_no="0" ship_pack="BULK"
                       total_pct="100">
                  <size_d alloc_qty="12" assoc_id="69400" ctn_sku="5602131" plan_pct_ratio="23.5"
                          row_no="0"
                          ship_pack="BULK"
                          size_code="XS"
                          sort_value="5"/>
               </Size_b>
               <Size_b assoc_id="69400" pct_ratio="PCT" priority="0" row_no="0" ship_pack="BULK"
                       total_pct="100">
                  <size_d alloc_qty="8" assoc_id="69400" ctn_sku="5602027" plan_pct_ratio="15" row_no="0"
                          ship_pack="BULK"
                          size_code="L"
                          sort_value="8"/>
               </Size_b>
            </size>
         </order_d>
      </order_h>
   </order>
</document>

予想される出力を得る方法を教えてください。@ディミトレ私の以前の投稿で私の正確な要件を説明していないことを申し訳ありません。

事前に感謝します。

4

1 に答える 1

1

XSLT1.0 を使用している場合、これは Muenchian Grouping と呼ばれる手法の仕事です。order_h要素をorder_no属性でグループ化しています。この場合、次のキーを定義します。

 <xsl:key name="order" match="order_h" use="@order_no" />

次に、各order_h要素について、指定されたorder_no属性のグループ内で最初に出現する要素を一致させる必要があります。これは次のように行います。

<xsl:template match="order_h[generate-id() = generate-id(key('order', @order_no)[1])]">

これがどのように機能するかを説明するために、式key('order', @order_no)[1]は現在の属性のキーの最初の要素を返します。次に、これを現在の要素と比較して、一致するかどうかを確認します。

このテンプレート内で、要素をコピーして、すべての子要素を次のように出力できます。

<xsl:apply-templates select="key('order', @order_no)/*" />

また、他のorder_h要素と一致するテンプレートが必要になるため、それらが 2 回出力されることはありません。

<xsl:template match="order_h" />

ここに完全な XSLT があります

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

   <xsl:key name="order" match="order_h" use="@order_no" />

   <xsl:template match="order_h[generate-id() = generate-id(key('order', @order_no)[1])]">
      <order_h>
         <xsl:apply-templates select="@*"/>
         <xsl:apply-templates select="key('order', @order_no)/*" />
      </order_h>
   </xsl:template>

   <xsl:template match="order_h" />

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

これにより、必要な出力が得られるはずです。

XSLT2.0 を使用している場合は、xsl:for-each-groupを使用して同じことを実現できます。

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

   <xsl:template match="order">
      <order>
         <xsl:for-each-group select="order_h" group-by="@order_no">
            <order_h>
               <xsl:apply-templates select="@*"/>
               <xsl:apply-templates select="current-group()/*"/>
            </order_h>
         </xsl:for-each-group>
      </order>
   </xsl:template>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>
于 2012-11-29T08:23:29.280 に答える