基于两个条件去除元素
问题描述:
我是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
。
+1为一个很好的答案。 – 2011-02-08 17:00:11