【问题标题】:Appending child node into the parent node将子节点附加到父节点
【发布时间】:2012-11-23 19:10:29
【问题描述】:

我需要将子节点附加到父节点中。 order_h 下的 order_no 等于 order_d 应该合并到父节点 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="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>

预期的 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_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>
</document>

提前致谢

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    这种转变

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

    应用于提供的 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="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>
    

    产生想要的正确结果

    <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_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 轴的使用...再次非常感谢您。
    • @user1760923,不客气。有关好的 XSLT/XPath 资源,请参阅:stackoverflow.com/questions/339930/…
    • 能否请您告诉我我们如何将下面的子节点带到同一父复杂类型下的同一父节点。例如,这里对于每个 order_h/order_d/@order_no 应该与以下 order_h/order_d/@order_no 匹配,如果这是真的,那么我必须将所有 order_d 放在一个 order_h 之下
    • @user1760923,请提出一个新问题。我刚上班,9-10 小时后就能处理您的新问题。
    • 正如你所说,我为此创建了新线程,这里是链接 stackoverflow.com/questions/13615463/... 在此先感谢
    猜你喜欢
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 2015-03-20
    相关资源
    最近更新 更多