XSLT 用子节点重复父节点

Posted

技术标签:

【中文标题】XSLT 用子节点重复父节点【英文标题】:XSLT repeat parent node with child node 【发布时间】:2013-02-22 19:40:21 【问题描述】:

我正在尝试在与子节点相同的行中重复父节点。我有用于创建报告的数据、当前样式表以及我希望输出的样子。我一直无法找到解决方案。如果您需要更多信息,请告诉我。感谢您的帮助,非常感谢。

数据

    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
      <SOAP-ENV:Body>
        <Result>
          <Item type="Part">
            <description>AML test</description>
            <id keyed_name="E008643" type="Part">57022FEA23B54493B691386368F5DFBB</id>
            <major_rev>1</major_rev>
            <name>9.6 Parts</name>
            <item_number>E008643</item_number>
            <Relationships>
              <Item type="Part AML">
                <related_id type="Manufacturer Part">
                  <Item type="Manufacturer Part">
                    <item_number>1804</item_number>
                  </Item>
                </related_id>
                <state>Preliminary</state>
              </Item>
              <Item type="Part AML">
                <related_id>
                  <Item type="Manufacturer Part">
                    <item_number>JNED</item_number>
                  </Item>
                </related_id>
                <state>Preliminary</state>
              </Item>
              <Item type="Part BOM">
                <quantity>1</quantity>
                <related_id keyed_name="E000371" type="Part">
                  <Item type="Part">
                    <description>Part 1</description>
                    <name>0</name>
                    <item_number>E000371</item_number>
                    <Relationships>
                      <Item type="Part AML">
                        <related_id type="Manufacturer Part">
                          <Item type="Manufacturer Part">
                            <manufacturer keyed_name="Speer" type="Manufacturer"></manufacturer>
                            <item_number>RK7D</item_number>
                          </Item>
                        </related_id>
                        <state>Preliminary</state>
                      </Item>
                      <Item type="Part AML">
                        <related_id type="Manufacturer Part">
                          <Item type="Manufacturer Part">
                            <manufacturer keyed_name="Ven" type="Manufacturer"></manufacturer>
                            <item_number>CR00T</item_number>
                          </Item>
                        </related_id>
                        <state>Preliminary</state>
                      </Item>
                      <Item type="Part AML">
                        <related_id type="Manufacturer Part">
                          <Item type="Manufacturer Part">
                            <manufacturer keyed_name="Sonic" type="Manufacturer"></manufacturer>
                            <item_number>ERJ</item_number>
                          </Item>
                        </related_id>
                        <state>Preliminary</state>
                      </Item>
                      <Item type="Part AML">
                        <related_id type="Manufacturer Part">
                          <Item type="Manufacturer Part">
                            <manufacturer keyed_name="Comp" type="Manufacturer"></manufacturer>
                            <item_number>NRCF</item_number>
                          </Item>
                        </related_id>
                        <state>Preliminary</state>
                      </Item>
                      <Item type="Part AML">
                        <related_id type="Manufacturer Part">
                          <Item type="Manufacturer Part">
                            <manufacturer keyed_name="Ya" type="Manufacturer"></manufacturer>
                            <item_number>RC0L</item_number>
                          </Item>
                        </related_id>
                        <state>Preliminary</state>
                      </Item>
                    </Relationships>
                  </Item>
                </related_id>
                <sort_order>128</sort_order>
              </Item>
              <Item type="Part BOM">
                <quantity>30</quantity>
                <related_id keyed_name="E001163" type="Part">
                  <Item type="Part">
                    <description>Part 2</description>
                    <name>82</name>
                    <item_number>E001163</item_number>
                    <Relationships>
                      <Item type="Part AML">
                        <related_id keyed_name="ECH-U1C822GX5" type="Manufacturer Part">
                          <Item type="Manufacturer Part">
                            <manufacturer keyed_name="Sonic" type="Manufacturer"></manufacturer>
                            <item_number>E2GX5</item_number>
                          </Item>
                        </related_id>
                        <state>Preliminary</state>
                      </Item>
                      <Item type="Part AML">
                        <related_id type="Manufacturer Part">
                          <Item type="Manufacturer Part">
                            <manufacturer keyed_name="Sonic" type="Manufacturer"></manufacturer>
                            <item_number>EGX5</item_number>
                          </Item>
                        </related_id>
                        <source_id keyed_name="E001163" type="Part"></source_id>
                        <state>Preliminary</state>
                      </Item>
                    </Relationships>
                  </Item>
                </related_id>
                <sort_order>256</sort_order>
              </Item>
             </Relationships>
          </Item>
        </Result>
      </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

当前样式表

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:aras="http://www.aras-corp.com">
      <xsl:output method="html" omit-xml-declaration="yes" standalone="yes" indent="yes"></xsl:output>
      <xsl:template match="/">
        <html>
          <head>
       </head>
          <style type="text/css" userData="Global">
    .cellSolid text-align:center;border-top:1px #000000 solid;border-right:1px #000000 solid;border-bottom:1px #000000 solid;border-left:1px #000000 solid;
    .cellSolidTopRight border-top:1px #000000 solid;border-right:1px #000000 solid;
    .cellSolidTopLeft border-top:1px #000000 solid;border-left:1px #000000 solid;
    .cellSolidRightBottom border-right:1px #000000 solid;border-bottom:1px #000000 solid;font-family:helvetica;font-size:8pt;
    .cellSolidBottomLeft border-bottom:1px #000000 solid;border-left:1px #000000 solid;
    .cellSolidTop border-top:1px #000000 solid;
    .cellSolidRight border-right:1px #000000 solid;
    .cellSolidBottom border-bottom:1px #000000 solid;
    .cellSolidLeft border-left:1px #000000 solid;
    .cellDashed border-top:1px #666666 dashed;border-right:1px #666666 dashed;border-bottom:1px #666666 dashed;border-left:1px #666666 dashed;
    .cellDashedTopRight border-top:1px #666666 dashed;border-right:1px #666666 dashed;
    .cellDashedTopLeft border-top:1px #666666 dashed;border-left:1px #666666 dashed;
    .cellDashedBottomRight border-bottom:1px #666666 dashed;border-right:1px #666666 dashed;
    .cellDashedBottomLeft border-bottom:1px #666666 dashed;border-left:1px #666666 dashed;
    .cellDashedTop border-top:1px #666666 dashed;
    .cellDashedRight border-right:1px #666666 dashed;
    .cellDashedBottom border-bottom:1px #666666 dashed;
    .cellDashedLeft border-left:1px #666666 dashed;
    .cellHeader background-color:#CCCCCC;border-top:1px #000000 solid;border-right:1px #000000 solid;border-bottom:1px #000000 solid;padding:2px;text-align:center;text-transform:capitalize;text-align:center;font-family:helvetica;font-weight:bold;font-size:8pt;
    .cellTitle border-top:1px #000000 solid;border-right:1px #000000 solid;border-left:1px #000000 solid;padding:2px;text-align:center;text-transform:capitalize;text-align:center;font-family:helvetica;font-weight:bold;font-size:8pt;
    table  empty-cells:show; border-collapse:collapse;
    td.noBorder font-family:helvetica; font-size:8pt;  padding:2px; border-width:0;
       </style>
          <body topmargin="50" leftmargin="50">
            <table border="0" cellspacing="0" cellpadding="0" >
              <tr>
                <td  uniqueID="ms__id11"></td>
                <td  uniqueID="ms__id12"></td>
                <td  uniqueID="ms__id13"></td>
         </tr>
              <tr valign="top">
                <td align="left" uniqueID="ms__id14" colspan="3">
                  <img src="../images/Logos/CooperPowerSystems.gif" ></img>
          </td>
         </tr>
              <tr valign="bottom">
                <td class="noBorder" colspan="13" style="font-family:helvetica;font-size:15pt;color:#DA1943;padding:2px;" align="left" uniqueID="ms__id15">AML Quantity Report -              <xsl:value-of select="//Item/name"></xsl:value-of> Rev              <xsl:value-of select="//Item/major_rev"></xsl:value-of>
                </td>
                <td class="noBorder" colspan="4" style="font-family:helvetica;font-size:10pt;padding:2px;" align="right" uniqueID="ms__id16">Generated on:              <script>function m00(r, n)r += ""; if (!n) n = 2; while(r.length &lt; n)r = "0" + r; return r; var dt = new Date(); var a = top.opener.top.aras; if (a)var s = m00(dt.getUTCFullYear(),4)+"-"+m00((dt.getUTCMonth()+1))+"-"+m00(dt.getUTCDate())+"T"+m00(dt.getUTCHours())+":"+m00(dt.getUTCMinutes())+":"+m00(dt.getUTCSeconds())+"+0000"; s = a.convertToNeutral(s, "date", "yyyy-MM-ddTHH:mm:sszzz"); s = a.convertFromNeutral(s, "date", "short_date"); document.write(s);</script>
                </td>
         </tr>
              <tr>
                <td class="cellHeader" style="border-left:1px #666666 solid;" uniqueID="ms__id17">Part Number</td>
                <td class="cellHeader" uniqueID="ms__id18">Name</td>
                <td class="cellHeader" uniqueID="ms__id32">Description</td>
                <td class="cellHeader" uniqueID="ms__id19">Calculated Quantity</td>
                <td class="cellHeader" uniqueID="ms__id20">AML Status</td>
                <td class="cellHeader" uniqueID="ms__id21">Manufacturer</td>
                <td class="cellHeader" uniqueID="ms__id22">Manufacturer Part</td>
         </tr>
              <xsl:call-template name="main"></xsl:call-template>
        </table>
       </body>
          <script src="../../javascript/PopupMenu.js"></script>
          <script src="../../javascript/PopupMenu.js"></script>
          <script src="../../javascript/PopupMenu.js"></script>
          <script src="../../javascript/PopupMenu.js"></script>
          <script src="../../javascript/PopupMenu.js"></script>
          <script src="../../javascript/PopupMenu.js"></script>
          <script src="../../javascript/PopupMenu.js"></script>
          <script src="../../javascript/PopupMenu.js"></script>
          <script src="../../javascript/PopupMenu.js"></script>
          <script src="../../javascript/PopupMenu.js"></script>
          <script src="../../javascript/PopupMenu.js"></script>
          <script src="../../javascript/PopupMenu.js"></script>
          <script src="../../javascript/PopupMenu.js"></script>
          <script src="../../javascript/PopupMenu.js"></script>
          <script src="../../javascript/PopupMenu.js"></script>
          <script src="../../javascript/PopupMenu.js"></script>
          <script src="../../javascript/PopupMenu.js"></script>
        </html>
     </xsl:template>
      <xsl:template name="main">
        <xsl:variable name="products"><!-- generate appropriate product for every item-->
          <xsl:call-template name="Unique"></xsl:call-template>
      </xsl:variable>
        <xsl:for-each select="//Item//Item[@type='Part']">
          <xsl:variable name="id" select="@id"></xsl:variable>
          <xsl:variable name="part_number">
            <xsl:value-of select="item_number"></xsl:value-of>
            <xsl:if test="item_number='' or not(item_number)">
              <xsl:text> </xsl:text>
        </xsl:if>
       </xsl:variable>
          <xsl:variable name="part_name">
            <xsl:value-of select="name"></xsl:value-of>
            <xsl:if test="name='' or not(name)">
              <xsl:text> </xsl:text>
        </xsl:if>
       </xsl:variable>
          <xsl:variable name="part_description">
            <xsl:value-of select="description"></xsl:value-of>
            <xsl:if test="description='' or not(description)">
              <xsl:text> </xsl:text>
        </xsl:if>
       </xsl:variable>
          <xsl:variable name="is_first" select="count(ancestor::Item[@type='Part' and @id=string($id)] | preceding::Item[@type='Part' and @id=string($id)])"></xsl:variable>
          <xsl:if test="$is_first = 0">
            <xsl:variable name="sum_of_products" select="sum(msxsl:node-set($products)/product_for_item[item_id = $id]/product)"></xsl:variable>
            <xsl:call-template name="draw_row_for_item">
              <xsl:with-param name="id" select="$id"></xsl:with-param>
              <xsl:with-param name="sum_of_products" select="$sum_of_products"></xsl:with-param>
              <xsl:with-param name="part_number" select="$part_number"></xsl:with-param>
              <xsl:with-param name="part_name" select="$part_name"></xsl:with-param>
              <xsl:with-param name="part_description" select="$part_description"></xsl:with-param>
            </xsl:call-template>
       </xsl:if>
       </xsl:for-each>
     </xsl:template>
     <!-- Draw rows of table-->
      <xsl:template name="draw_row_for_item">
        <xsl:param name="id"></xsl:param>
        <xsl:param name="sum_of_products"></xsl:param>
        <xsl:param name="part_number"></xsl:param>
        <xsl:param name="part_name"></xsl:param>
        <xsl:param name="part_description"></xsl:param>
        <tr>
          <xsl:variable name="rowCount">
            <xsl:choose>
              <xsl:when test="count(Relationships/Item[@type='Part AML'])=0">1</xsl:when>          <xsl:otherwise>
                <xsl:value-of select="count(Relationships/Item[@type='Part AML'])"></xsl:value-of>
            </xsl:otherwise>
       </xsl:choose>
      </xsl:variable>
          <td rowspan="$rowCount" class="cellSolidRightBottom"  style="border-left:1px #666666 solid;" align="center" uniqueID="ms__id23">
            <xsl:value-of select="$part_number"></xsl:value-of>
       </td>
          <td rowspan="$rowCount" class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">
            <xsl:value-of select="$part_name"></xsl:value-of>
       </td>
          <td rowspan="$rowCount" class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">
            <xsl:value-of select="$part_description"></xsl:value-of>
       </td>
          <td rowspan="$rowCount" class="cellSolidRightBottom"  align="center" uniqueID="ms__id25">
            <xsl:value-of select="$sum_of_products"></xsl:value-of>
       </td>
          <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id26">
            <xsl:value-of select="Relationships/Item[@type='Part AML'][1]/state"></xsl:value-of>
       </td>
          <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id27">
            <xsl:value-of select="Relationships/Item[@type='Part AML'][1]/related_id/Item/manufacturer/@keyed_name"></xsl:value-of>
       </td>
          <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id28">
            <xsl:value-of select="Relationships/Item[@type='Part AML'][1]/related_id/Item/item_number"></xsl:value-of>
       </td>
      </tr>
        <xsl:apply-templates select="Relationships/Item[@type='Part AML'][position()!=1]"></xsl:apply-templates>
      </xsl:template>
     <!--use unique id and calculate quantity for item in current chain-->
      <xsl:template name="Unique">
        <xsl:for-each select="//Item[@type='Part']">
          <xsl:variable name="cur_id" select="@id"></xsl:variable>
          <xsl:if test="not(count(descendant::Item[@type='Part' and @id=string($cur_id)]))">
            <product_for_item>
              <item_id>
                <xsl:value-of select="$cur_id"></xsl:value-of>
              </item_id>
              <product>
                <xsl:variable name="quantity" select="../../quantity"></xsl:variable>
                <xsl:choose>
                  <xsl:when test="string($quantity) = ''">0</xsl:when>
                  <xsl:otherwise>
                    <xsl:apply-templates mode="product_of_quantity" select="../..">
                      <xsl:with-param name="product_of_chain" select="$quantity"></xsl:with-param>
                    </xsl:apply-templates>
                  </xsl:otherwise>
                </xsl:choose>
             </product>
            </product_for_item>
          </xsl:if>
        </xsl:for-each>
      </xsl:template>
     <!--calculate product of quantities for item in its chain -->
      <xsl:template mode="product_of_quantity" match="Item[@type='Part BOM']">
        <xsl:param name="product_of_chain"></xsl:param>
        <xsl:choose><!-- If current Part BOM at the top of the current chain -->
          <xsl:when test="not(count(ancestor::Item[@type='Part BOM']))">
            <xsl:value-of select="number($product_of_chain)"></xsl:value-of>
          </xsl:when>
          <xsl:otherwise><!-- Get the quantity of the next relationship Part BOM and apply recursion again for it-->
            <xsl:variable name="quantity" select="../../../../quantity"></xsl:variable>
            <xsl:apply-templates mode="product_of_quantity" select="../../../..">
              <xsl:with-param name="product_of_chain" select="number($quantity)*number($product_of_chain)"></xsl:with-param>
        </xsl:apply-templates>
       </xsl:otherwise>
      </xsl:choose>
     </xsl:template>
      <xsl:template match="Item[@type='Part AML']">
        <tr>
          <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id29">
            <xsl:value-of select="state"></xsl:value-of>
          </td>
          <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id30">
            <xsl:value-of select="related_id/Item/manufacturer/@keyed_name"></xsl:value-of>
          </td>
          <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id31">
            <xsl:value-of select="related_id/Item/item_number"></xsl:value-of>
          </td>
        </tr>
      </xsl:template>

    </xsl:stylesheet>

首选输出

    <html xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:aras="http://www.aras-corp.com">
      <head>
        <META http-equiv="Content-Type" content="text/html; charset=utf-16">
      </head>
      <style type="text/css" userData="Global">
    .cellSolid text-align:center;border-top:1px #000000 solid;border-right:1px #000000 solid;border-bottom:1px #000000 solid;border-left:1px #000000 solid;
    .cellSolidTopRight border-top:1px #000000 solid;border-right:1px #000000 solid;
    .cellSolidTopLeft border-top:1px #000000 solid;border-left:1px #000000 solid;
    .cellSolidRightBottom border-right:1px #000000 solid;border-bottom:1px #000000 solid;font-family:helvetica;font-size:8pt;
    .cellSolidBottomLeft border-bottom:1px #000000 solid;border-left:1px #000000 solid;
    .cellSolidTop border-top:1px #000000 solid;
    .cellSolidRight border-right:1px #000000 solid;
    .cellSolidBottom border-bottom:1px #000000 solid;
    .cellSolidLeft border-left:1px #000000 solid;
    .cellDashed border-top:1px #666666 dashed;border-right:1px #666666 dashed;border-bottom:1px #666666 dashed;border-left:1px #666666 dashed;
    .cellDashedTopRight border-top:1px #666666 dashed;border-right:1px #666666 dashed;
    .cellDashedTopLeft border-top:1px #666666 dashed;border-left:1px #666666 dashed;
    .cellDashedBottomRight border-bottom:1px #666666 dashed;border-right:1px #666666 dashed;
    .cellDashedBottomLeft border-bottom:1px #666666 dashed;border-left:1px #666666 dashed;
    .cellDashedTop border-top:1px #666666 dashed;
    .cellDashedRight border-right:1px #666666 dashed;
    .cellDashedBottom border-bottom:1px #666666 dashed;
    .cellDashedLeft border-left:1px #666666 dashed;
    .cellHeader background-color:#CCCCCC;border-top:1px #000000 solid;border-right:1px #000000 solid;border-bottom:1px #000000 solid;padding:2px;text-align:center;text-transform:capitalize;text-align:center;font-family:helvetica;font-weight:bold;font-size:8pt;
    .cellTitle border-top:1px #000000 solid;border-right:1px #000000 solid;border-left:1px #000000 solid;padding:2px;text-align:center;text-transform:capitalize;text-align:center;font-family:helvetica;font-weight:bold;font-size:8pt;
    table  empty-cells:show; border-collapse:collapse;
    td.noBorder font-family:helvetica; font-size:8pt;  padding:2px; border-width:0;
       </style>
      <body topmargin="50" leftmargin="50">
        <table border="0" cellspacing="0" cellpadding="0" >
          <tr>
            <td  uniqueID="ms__id11"></td>
            <td  uniqueID="ms__id12"></td>
            <td  uniqueID="ms__id13"></td>
          </tr>
          <tr valign="top">
            <td align="left" uniqueID="ms__id14" colspan="3"><img src="../images/Logos/CooperPowerSystems.gif" ></td>
          </tr>
          <tr valign="bottom">
            <td class="noBorder" colspan="13" style="font-family:helvetica;font-size:15pt;color:#DA1943;padding:2px;" align="left" uniqueID="ms__id15">AML Quantity Report -              9.6 Parts Rev              1</td>
            <td class="noBorder" colspan="4" style="font-family:helvetica;font-size:10pt;padding:2px;" align="right" uniqueID="ms__id16">Generated on:              <script>function m00(r, n)r += ""; if (!n) n = 2; while(r.length < n)r = "0" + r; return r; var dt = new Date(); var a = top.opener.top.aras; if (a)var s = m00(dt.getUTCFullYear(),4)+"-"+m00((dt.getUTCMonth()+1))+"-"+m00(dt.getUTCDate())+"T"+m00(dt.getUTCHours())+":"+m00(dt.getUTCMinutes())+":"+m00(dt.getUTCSeconds())+"+0000"; s = a.convertToNeutral(s, "date", "yyyy-MM-ddTHH:mm:sszzz"); s = a.convertFromNeutral(s, "date", "short_date"); document.write(s);</script></td>
          </tr>
          <tr>
            <td class="cellHeader" style="border-left:1px #666666 solid;" uniqueID="ms__id17">Part Number</td>
            <td class="cellHeader" uniqueID="ms__id18">Name</td>
            <td class="cellHeader" uniqueID="ms__id32">Description</td>
            <td class="cellHeader" uniqueID="ms__id19">Calculated Quantity</td>
            <td class="cellHeader" uniqueID="ms__id20">AML Status</td>
            <td class="cellHeader" uniqueID="ms__id21">Manufacturer</td>
            <td class="cellHeader" uniqueID="ms__id22">Manufacturer Part</td>
          </tr>
          <tr>
            <td class="cellSolidRightBottom"  style="border-left:1px #666666 solid;" align="center" uniqueID="ms__id23">E000371</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">0</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">Part 1</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id25">0</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id26">Preliminary</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id27">Speer</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id28">RK7D</td>
          </tr>
          <tr>
            <td class="cellSolidRightBottom"  style="border-left:1px #666666 solid;" align="center" uniqueID="ms__id23">E000371</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">0</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">Part 1</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id25">0</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id29">Preliminary</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id30">Ven</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id31">CR00T</td>
          </tr>
          <tr>
            <td class="cellSolidRightBottom"  style="border-left:1px #666666 solid;" align="center" uniqueID="ms__id23">E000371</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">0</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">Part 1</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id25">0</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id29">Preliminary</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id30">Sonic</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id31">ERJ</td>
          </tr>
          <tr>
            <td class="cellSolidRightBottom"  style="border-left:1px #666666 solid;" align="center" uniqueID="ms__id23">E000371</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">0</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">Part 1</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id25">0</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id29">Preliminary</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id30">Comp</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id31">NRCF</td>
          </tr>
          <tr>
            <td class="cellSolidRightBottom"  style="border-left:1px #666666 solid;" align="center" uniqueID="ms__id23">E000371</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">0</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">Part 1</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id25">0</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id29">Preliminary</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id30">Ya</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id31">RC0L</td>
          </tr>
          <tr>
            <td class="cellSolidRightBottom"  style="border-left:1px #666666 solid;" align="center" uniqueID="ms__id23">E001163</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">82</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">Part 2</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id25">0</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id26">Preliminary</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id27">Sonic</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id28">E2GX5</td>
          </tr>
          <tr>
            <td class="cellSolidRightBottom"  style="border-left:1px #666666 solid;" align="center" uniqueID="ms__id23">E001163</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">82</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">Part 2</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id25">0</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id29">Preliminary</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id30">Sonic</td>
            <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id31">EGX5</td>
          </tr>
        </table>
      </body><script src="../../javascript/PopupMenu.js"></script><script src="../../javascript/PopupMenu.js"></script><script src="../../javascript/PopupMenu.js"></script><script src="../../javascript/PopupMenu.js"></script><script src="../../javascript/PopupMenu.js"></script><script src="../../javascript/PopupMenu.js"></script><script src="../../javascript/PopupMenu.js"></script><script src="../../javascript/PopupMenu.js"></script><script src="../../javascript/PopupMenu.js"></script><script src="../../javascript/PopupMenu.js"></script><script src="../../javascript/PopupMenu.js"></script><script src="../../javascript/PopupMenu.js"></script><script src="../../javascript/PopupMenu.js"></script><script src="../../javascript/PopupMenu.js"></script><script src="../../javascript/PopupMenu.js"></script><script src="../../javascript/PopupMenu.js"></script><script src="../../javascript/PopupMenu.js"></script></html>

【问题讨论】:

一个较小的测试用例在这里会有所帮助,那里有大量数据。 实际描述您想要的输出与您当前的输出有何不同,而不仅仅是一个示例来挖掘也是有帮助的。 【参考方案1】:

我认为您的 XSLT 可能需要进行大量清理,但要实现您想要的输出,您可以替换它:

<xsl:call-template name="draw_row_for_item">
  <xsl:with-param name="id" select="$id"></xsl:with-param>
  <xsl:with-param name="sum_of_products" select="$sum_of_products"></xsl:with-param>
  <xsl:with-param name="part_number" select="$part_number"></xsl:with-param>
  <xsl:with-param name="part_name" select="$part_name"></xsl:with-param>
  <xsl:with-param name="part_description" select="$part_description"></xsl:with-param>
</xsl:call-template>

用这个:

<xsl:apply-templates select="Relationships/Item[@type='Part AML']">
  <xsl:with-param name="sum_of_products" select="$sum_of_products"></xsl:with-param>
  <xsl:with-param name="part_number" select="$part_number"></xsl:with-param>
  <xsl:with-param name="part_name" select="$part_name"></xsl:with-param>
  <xsl:with-param name="part_description" select="$part_description"></xsl:with-param>
</xsl:apply-templates>

将 XSLT 中的最后一个模板修改为:

  <xsl:template match="Item[@type='Part AML']">
    <xsl:param name="sum_of_products"></xsl:param>
    <xsl:param name="part_number"></xsl:param>
    <xsl:param name="part_name"></xsl:param>
    <xsl:param name="part_description"></xsl:param>
    <xsl:variable name="nonFirstShift" select="3 * (position() != 1)" />
    <tr>
      <td class="cellSolidRightBottom"  style="border-left:1px #666666 solid;" align="center" uniqueID="ms__id23">
        <xsl:value-of select="$part_number"></xsl:value-of>
      </td>
      <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">
        <xsl:value-of select="$part_name"></xsl:value-of>
      </td>
      <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id24">
        <xsl:value-of select="$part_description"></xsl:value-of>
      </td>
      <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id25">
        <xsl:value-of select="$sum_of_products"></xsl:value-of>
      </td>
      <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id26 + $nonFirstShift">
        <xsl:value-of select="state"></xsl:value-of>
      </td>
      <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id27 + $nonFirstShift">
        <xsl:value-of select="related_id/Item/manufacturer/@keyed_name"></xsl:value-of>
      </td>
      <td class="cellSolidRightBottom"  align="center" uniqueID="ms__id28 + $nonFirstShift">
        <xsl:value-of select="related_id/Item/item_number"></xsl:value-of>
      </td>
    </tr>
  </xsl:template>

然后你可以删除draw_row_for_item模板。

【讨论】:

以上是关于XSLT 用子节点重复父节点的主要内容,如果未能解决你的问题,请参考以下文章

XSLT 将具有父节点的节点移动到具有给定属性的每个父节点的兄弟节点中

XSLT 根据最大​​子节点对父节点进行排序

xslt 具有父节点的递归子节点

XSLT 1.0 - 连接已知子节点,按未知父节点分组

在 XSLT 中对每个父节点下的子节点进行分组

C#只查询xslt的父节点