基于两个条件去除元素

问题描述:

我是XSLT的新手,并且遇到了从输出中删除重复条目的问题。基于两个条件去除元素

示例XML的文件:

<Datenaustausch> 
<Meldung> 
    <Anfallstelle> 
     <AS> 
      <ASStamm> 
       <ASNR>009803336</ASNR> 
       <ASENF>false</ASENF> 
       <ASInaktiv>false</ASInaktiv> 
      </ASStamm> 
      <ASDaten> 
       <ASMeldung> 
        <ASGueltigAb>2003-04-25</ASGueltigAb> 
        <ASMldData> 
         <ASLizData> 
          <ASFrk>8xx</ASFrk> 
          <ASLizGrad>100</ASLizGrad> 
          <ASAntVerp>100</ASAntVerp> 
         </ASLizData> 
        </ASMldData> 
       </ASMeldung> 
       <ASMeldung> 
        <ASGueltigAb>2008-05-15</ASGueltigAb> 
        <ASMldData> 
         <ASLizData> 
          <ASFrk>8xx</ASFrk> 
          <ASLizGrad>100</ASLizGrad> 
          <ASAntVerp>100</ASAntVerp> 
         </ASLizData> 
        </ASMldData> 
       </ASMeldung> 
       <ASMeldung> 
        <ASGueltigAb>2010-08-20</ASGueltigAb> 
        <ASMldData> 
         <ASLizData> 
          <ASFrk>40x</ASFrk> 
          <ASLizGrad>100</ASLizGrad> 
          <ASAntVerp>100</ASAntVerp> 
         </ASLizData> 
         <ASLizData> 
          <ASFrk>8xx</ASFrk> 
          <ASLizGrad>100</ASLizGrad> 
          <ASAntVerp>100</ASAntVerp> 
         </ASLizData> 
        </ASMldData> 
       </ASMeldung> 
      </ASDaten> 
     </AS> 
     <AS> 
      <ASStamm> 
       <ASNR>031630116</ASNR> 
       <ASENF>false</ASENF> 
       <ASInaktiv>false</ASInaktiv> 
      </ASStamm> 
      <ASDaten> 
       <ASMeldung> 
        <ASGueltigAb>2009-04-21</ASGueltigAb> 
        <ASMldData> 
         <ASLizData> 
          <ASFrk>400</ASFrk> 
          <ASLizGrad>100</ASLizGrad> 
          <ASAntVerp>100</ASAntVerp> 
         </ASLizData> 
         <ASLizData> 
          <ASFrk>8xx</ASFrk> 
          <ASLizGrad>100</ASLizGrad> 
          <ASAntVerp>100</ASAntVerp> 
         </ASLizData> 
        </ASMldData> 
       </ASMeldung> 
      </ASDaten> 
     </AS> 
     <AS> 
      <ASStamm> 
       <ASNR>040917889</ASNR> 
       <ASENF>false</ASENF> 
       <ASInaktiv>false</ASInaktiv> 
      </ASStamm> 
      <ASDaten> 
       <ASMeldung> 
        <ASGueltigAb>2007-11-15</ASGueltigAb> 
        <ASMldData> 
         <ASLizData> 
          <ASFrk>400</ASFrk> 
          <ASLizGrad>100</ASLizGrad> 
          <ASAntVerp>100</ASAntVerp> 
         </ASLizData> 
         <ASLizData> 
          <ASFrk>42x</ASFrk> 
          <ASLizGrad>100</ASLizGrad> 
          <ASAntVerp>100</ASAntVerp> 
         </ASLizData> 
         <ASLizData> 
          <ASFrk>8xx</ASFrk> 
          <ASLizGrad>100</ASLizGrad> 
          <ASAntVerp>100</ASAntVerp> 
         </ASLizData> 
        </ASMldData> 
       </ASMeldung> 
       <ASMeldung> 
        <ASGueltigAb>2009-01-19</ASGueltigAb> 
        <ASMldData> 
         <ASLizData> 
          <ASFrk>400</ASFrk> 
          <ASLizGrad>100</ASLizGrad> 
          <ASAntVerp>100</ASAntVerp> 
         </ASLizData> 
         <ASLizData> 
          <ASFrk>42x</ASFrk> 
          <ASLizGrad>100</ASLizGrad> 
          <ASAntVerp>100</ASAntVerp> 
         </ASLizData> 
         <ASLizData> 
          <ASFrk>8xx</ASFrk> 
          <ASLizGrad>100</ASLizGrad> 
          <ASAntVerp>100</ASAntVerp> 
         </ASLizData> 
        </ASMldData> 
       </ASMeldung> 
       <ASMeldung> 
        <ASGueltigAb>2010-06-25</ASGueltigAb> 
        <ASMldData> 
         <ASLizData> 
          <ASFrk>400</ASFrk> 
          <ASLizGrad>100</ASLizGrad> 
          <ASAntVerp>100</ASAntVerp> 
         </ASLizData> 
         <ASLizData> 
          <ASFrk>42x</ASFrk> 
          <ASLizGrad>100</ASLizGrad> 
          <ASAntVerp>100</ASAntVerp> 
         </ASLizData> 
         <ASLizData> 
          <ASFrk>8xx</ASFrk> 
          <ASLizGrad>100</ASLizGrad> 
          <ASAntVerp>100</ASAntVerp> 
         </ASLizData> 
        </ASMldData> 
       </ASMeldung> 
      </ASDaten> 
     </AS> 
        <AS> 
        .... 
        </AS> 
     </Anfallstelle> 
</Meldung> 
</Datenaustausch> 

....代表相同的多个订单如上

我需要得到这个输出:

从每一个 'ASStamm',其中该ID是'ASNR'我该如何删除具有最早日期('ASGueltigAb')的重复条目('ASFrk')。

例如第一 'AS' 条目应该是这样的:

 <tr> 
      <td>009803336</td> 
      <td>8xx</td> 
      <td>100</td> 
      <td>100</td> 
      <td>2008-05-15</td> 
     </tr> 
     <tr> 
      <td>009803336</td> 
      <td>40x</td> 
      <td>100</td> 
      <td>100</td> 
      <td>2010-08-20</td> 
     </tr> 

重复的条目(与 'ASFrk'(8XX)和旧日期 'ASGueltigAb'(2003-04-25))去掉了。

目前我使用这个“解决方案”将XML转换为HTML表格,但不删除重复的条目。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
     <html> 
      <head> 
       <title>XML</title> 
      </head> 
      <body> 
       <table border="1"> 
        <tr> 
         <th>ASNR</th> 
         <th>ASFrk</th> 
         <th>ASLizGrad</th> 
         <th>ASAntVerp</th> 
         <th>ASGueltigAb</th> 
        </tr> 
        <xsl:for-each select="/Datenaustausch/Meldung/Anfallstelle/AS"> 
         <xsl:sort select="ASStamm/ASNR" data-type="number"/> 
         <xsl:for-each select="ASDaten/ASMeldung"> 
          <xsl:sort select="ASMldData/ASLizData/ASFrk" order="descending"/> 
          <xsl:sort select="ASGueltigAb" order="descending" /> 
          <tr> 
           <td> 
            <xsl:value-of select="parent::*/parent::AS/ASStamm/ASNR"/> 
           </td> 
           <td> 
            <xsl:value-of select="ASMldData/ASLizData/ASFrk"/> 
           </td> 
           <td> 
            <xsl:value-of select="ASMldData/ASLizData/ASLizGrad"/> 
           </td> 
           <td> 
            <xsl:value-of select="ASMldData/ASLizData/ASAntVerp"/> 
           </td> 
           <td> 
            <xsl:value-of select="ASGueltigAb"/> 
           </td> 
          </tr> 
         </xsl:for-each> 
        </xsl:for-each> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

HTML输出:

实施例1: http://img152.imageshack.us/i/xmlex.jpg/

标记行应为被删除 'ASNR'-ID(009803336),对于下一个例子' ASNR'- ID(040917889)应删除两条标记线。

例2: http://img710.imageshack.us/i/xmlex2.jpg/

我认为与使用“Muenchian分组的”的解决方案,但我不知道怎么办。

有人可以帮助我使用XSLT 1.0获得解决方案吗?

这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="kASLizDataByASNR-ASFrk" 
      match="ASLizData" 
      use="concat(preceding::ASNR[1],'+',ASFrk)"/> 
    <xsl:template match="text()"/> 
    <xsl:template match="/"> 
     <html> 
      <head> 
       <title>XML</title> 
      </head> 
      <body> 
       <table border="1"> 
        <tr> 
         <th>ASNR</th> 
         <th>ASFrk</th> 
         <th>ASLizGrad</th> 
         <th>ASAntVerp</th> 
         <th>ASGueltigAb</th> 
        </tr> 
        <xsl:apply-templates/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 
    <xsl:template match="ASLizData[ 
          count(
           .|key('kASLizDataByASNR-ASFrk', 
            concat(preceding::ASNR[1],'+',ASFrk) 
           )[1] 
          ) = 1 
         ]"> 
     <xsl:variable name="vASNR" select="preceding::ASNR[1]"/> 
     <xsl:for-each select="key('kASLizDataByASNR-ASFrk', 
            concat($vASNR,'+',ASFrk) 
          )"> 
      <xsl:sort select="../../ASGueltigAb" order="descending"/> 
      <xsl:if test="position()=1"> 
       <tr> 
        <td> 
         <xsl:value-of select="$vASNR"/> 
        </td> 
        <xsl:apply-templates mode="cell"/> 
        <td> 
         <xsl:value-of select="../../ASGueltigAb"/> 
        </td> 
       </tr> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 
    <xsl:template match="ASLizData/*" mode="cell"> 
     <td> 
      <xsl:value-of select="."/> 
     </td> 
    </xsl:template> 
</xsl:stylesheet> 

输出:

<html> 
    <head> 
     <META http-equiv="Content-Type" content="text/html; charset=UTF-16"> 
     <title>XML</title> 
    </head> 
    <body> 
     <table border="1"> 
      <tr> 
       <th>ASNR</th> 
       <th>ASFrk</th> 
       <th>ASLizGrad</th> 
       <th>ASAntVerp</th> 
       <th>ASGueltigAb</th> 
      </tr> 
      <tr> 
       <td>009803336</td> 
       <td>8xx</td> 
       <td>100</td> 
       <td>100</td> 
       <td>2010-08-20</td> 
      </tr> 
      <tr> 
       <td>009803336</td> 
       <td>40x</td> 
       <td>100</td> 
       <td>100</td> 
       <td>2010-08-20</td> 
      </tr> 
      <tr> 
       <td>031630116</td> 
       <td>400</td> 
       <td>100</td> 
       <td>100</td> 
       <td>2009-04-21</td> 
      </tr> 
      <tr> 
       <td>031630116</td> 
       <td>8xx</td> 
       <td>100</td> 
       <td>100</td> 
       <td>2009-04-21</td> 
      </tr> 
      <tr> 
       <td>040917889</td> 
       <td>400</td> 
       <td>100</td> 
       <td>100</td> 
       <td>2010-06-25</td> 
      </tr> 
      <tr> 
       <td>040917889</td> 
       <td>42x</td> 
       <td>100</td> 
       <td>100</td> 
       <td>2010-06-25</td> 
      </tr> 
      <tr> 
       <td>040917889</td> 
       <td>8xx</td> 
       <td>100</td> 
       <td>100</td> 
       <td>2010-06-25</td> 
      </tr> 
     </table> 
    </body> 
</html> 

注意:由ASNR和ASFrk关键。最大for-each

+0

+1为一个很好的答案。 – 2011-02-08 17:00:11