2012-11-28 75 views
0

我想在order_h中追加多個子節點order_d in order_h matching order_no under order_h。在父節點下追加多個子節點

這裏是我的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> 

莫非有人請讓我知道我如何得到預期的輸出。 @ Dimitre對不起在我以前的帖子中解釋我的確切要求。

非常感謝。

回答

1

如果您使用的是XSLT1.0,那麼這是一項名爲Muenchian Grouping的工作。您是分組通過order_no屬性order_h元素,在這種情況下,定義了以下重點:

<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元素:

<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:對,每個組來達到同樣的事情

<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> 
+0

感謝您的解決方案。您的XSLT 2.0按預期工作。 – Tarak