根据条件对元素进行分组并消除重复项

  • 本文关键字:条件 元素 xslt-1.0
  • 更新时间 :
  • 英文 :


我在根据标准对元素进行分组并消除重复项时遇到问题。

我在 XML 中有 2 条记录。文档 1 和文档 2

目标是创建一个包含 3 个部分的表格。相同、添加、删除。记录中的元素应与其数量放在同一小节中。文档 1 中不存在且存在于文档 2 中的元素应进入"添加"小节,文档 1 中不存在但文档 2 中不存在的元素应进入"删除"小节。

在这里,我能够创建 3 个小节及其总数。现在我的问题是根据同一文档中的rec_no识别相似的元素并将它们的数量相加。

这是包含我的评论的输出表。

---------------------------------------------------------
Section RecNo   Desc    Doc-1 Qty   Doc-2 Qty   Total
---------------------------------------------------------
Same    111     Desc1   1           2            300
Same    444     Desc4   6           4           1000
---------------------------------------------------------
Same Total                                      1300
---------------------------------------------------------
Add     333     Desc3   3           0           300
Add     555     Desc5   5           0           500
---------------------------------------------------------
Add Total                                       800
---------------------------------------------------------
Delete  222     Desc2   0           2           200
Delete  777     Desc7   0           7           700
Delete  888     Desc8   0          10          1000
---------------------------------------------------------
Delete Total                                   1900
---------------------------------------------------------
Grand Total                                    4000
---------------------------------------------------------

这是我的 XML

<Logia>
  <DocHeader>
        <Document>
            <Downto>
                <rec_no>111</rec_no>
                <desc>Desc1</desc>
                <qty>1</qty>
                <Value>100.00</Value>
            </Downto>
            <Downto>
                <rec_no>333</rec_no>
                <desc>Desc3</desc>
                <qty>3</qty>
                <Value>300.00</Value>
            </Downto>
            <Downto>
                <rec_no>444</rec_no>
                <desc>Desc4</desc>
                <qty>6</qty>
                <Value>400.00</Value>
            </Downto>
            <Downto>
                <rec_no>555</rec_no>
                <desc>Desc5</desc>
                <qty>5</qty>
                <Value>500.00</Value>
            </Downto>
        </Document>
        <Document>
            <Downto>
                <rec_no>222</rec_no>
                <desc>Desc2</desc>
                <qty>2</qty>
                <Value>200.00</Value>
            </Downto>
            <Downto>
                <rec_no>111</rec_no>
                <desc>Desc1</desc>
                <qty>2</qty>
                <Value>100.00</Value>
            </Downto>
            <Downto>
                <rec_no>444</rec_no>
                <desc>Desc4</desc>
                <qty>4</qty>
                <Value>400.00</Value>
            </Downto>
            <Downto>
                <rec_no>777</rec_no>
                <desc>Desc7</desc>
                <qty>7</qty>
                <Value>700.00</Value>
            </Downto>
            <Downto>
                <rec_no>888</rec_no>
                <desc>Desc8</desc>
                <qty>8</qty>
                <Value>800.00</Value>
            </Downto>   
            <Downto>
                <rec_no>888</rec_no>
                <desc>Desc8</desc>
                <qty>2</qty>
                <Value>800.00</Value>
            </Downto>
         </Document>
  </DocHeader>
</Logia>

这是我的 XSLT

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="doc1" match="Document[1]/Downto" use="rec_no" />
<xsl:key name="doc2" match="Document[2]/Downto" use="rec_no" />
<xsl:template match="/Logia/DocHeader">
    <table border="1">
        <!-- header -->
        <tr>
            <th>Section</th>
            <th>RecNo</th>
            <th>Desc</th>
            <th>Doc-1 Qty</th>
            <th>Doc-2 Qty</th>   
            <th> Total</th>
        </tr>
        <!-- same -->
        <xsl:variable name="same" select="Document[1]/Downto[key('doc2', rec_no )]" />  
        <xsl:apply-templates select="$same">
            <xsl:with-param name="section">Same</xsl:with-param>
        </xsl:apply-templates>
        <xsl:variable name="same-total" select="sum($same/Value)" />    
        <tr>
            <td colspan="5">Same Total</td>
            <th><xsl:value-of select="$same-total"/></th>
        </tr>
        <!-- add -->
        <xsl:variable name="add" select="Document[1]/Downto[not(key('doc2', rec_no ))]" />  
        <xsl:apply-templates select="$add">
            <xsl:with-param name="section">Add</xsl:with-param>
        </xsl:apply-templates>
        <xsl:variable name="add-total" select="sum($add/Value)" />  
        <tr>
            <td colspan="5">Add Total</td>
            <th><xsl:value-of select="$add-total"/></th>
        </tr>
        <!-- delete -->
        <xsl:variable name="delete" select="Document[2]/Downto[not(key('doc1', rec_no ))]" />   
        <xsl:apply-templates select="$delete">
            <xsl:with-param name="section">Delete</xsl:with-param>
        </xsl:apply-templates>
        <xsl:variable name="delete-total" select="sum($delete/Value)" />    
        <tr>
            <td colspan="5">Delete Total</td>
            <th><xsl:value-of select="$delete-total"/></th>
        </tr>
        <!-- grand total -->
        <tr>
            <th colspan="5">Grand Total</th>
            <th><xsl:value-of select="$same-total + $add-total + $delete-total"/></th>
        </tr>
    </table>
</xsl:template>
<xsl:template match="Downto">
    <xsl:param name="section"/>
    <tr>
        <td><xsl:value-of select="$section"/></td>
        <td><xsl:value-of select="rec_no"/></td>
        <td><xsl:value-of select="desc"/></td>
        <td><xsl:value-of select="qty"/></td>
        <td><xsl:value-of select="qty"/></td>  
        <td><xsl:value-of select="Value"/></td>
    </tr>
</xsl:template>
</xsl:stylesheet>

任何帮助,不胜感激。

代码中没有太多要更改的内容:

新密钥:

<xsl:key name="docByRecNo" match="Document/Downto" use="rec_no" />

修改匹配的模板:

<xsl:template match="Downto">
    <xsl:param name="section"/>
    <xsl:if test="generate-id() = generate-id(key('docByRecNo', rec_no)[1])">
      <tr>
          <td><xsl:value-of select="$section"/></td>
          <td><xsl:value-of select="rec_no"/></td>
          <td><xsl:value-of select="desc"/></td>
          <td><xsl:value-of select="sum(key('doc1', rec_no)/qty)"/></td>
          <td><xsl:value-of select="sum(key('doc2', rec_no)/qty)"/></td>
          <td><xsl:value-of select="sum(key('docByRecNo', rec_no)/Value)"/></td>
      </tr>
    </xsl:if>
</xsl:template>

在这里,我们只选择那些 Downto 记录,这些记录是具有相同rec_no(Muench 分组)组中的第一个元素。

相关内容

  • 没有找到相关文章

最新更新