在任何其他语言中,我都可以将前一行的值存储在一个变量中,然后看看它是否与当前值匹配,但遗憾的是,XSL中的变量并不是真正的"变量"或类似的东西。。。
那么,我该如何完成本应"轻松"的任务呢?
我有一些(可能是格式不正确的)XML,由第三方应用程序输出。我使用它来使用XSL:将以下每一行输出为html表行
<xsl:for-each select="Designs/TrackingDetails/Details">
<tr>
<th width="200"><xsl:value-of select="./@DGGroup"/></th>
<th width="350"><xsl:value-of select="./@DGName"/></th>
<td><xsl:value-of select="./@DGDate"/></td>
<td><xsl:value-of select="./@DGUser"/></td>
</tr>
</xsl:for-each>
我希望它只打印每个唯一的"DGGroup"一次,但它要么全部打印,要么什么都不打印。
所以,最后,我想要这样的HTML(使用类似于我文章底部的XML):
<tr><td>General</td><td>Quote in Date</td><td>04/16/2015</td><td>Ed Garcia</td></tr>
下一行:
<tr><td></td><td>Bid Complete</td><td>04/12/2015</td><td>John Smith</td></tr>
以下是我迄今为止尝试过的一些代码:
<xsl:if test="preceding-sibling::./DGGroup[1]=self::./DGGroup">
和
<xsl:if test="preceding-sibling::*[1]=./@DGGroup">
两者都不起作用
以下是一些XML:的示例
<Designs>
<TrackingDetails Transactions_Id="2" Reference="A1234">
<Details DGGroup="General" DGName="Quote in Date" DGDate="04/16/2015" DGUser="Ed Garcia" />
<Details DGGroup="General" DGName="Bid Complete" DGDate="04/12/2015" DGUser="John Smith" />
<Details DGGroup="Design" DGName="Approval Recieved" DGDate="" DGUser="" />
<Details DGGroup="Design" DGName="Design Complete" DGDate="09/18/2015" DGUser="Fred Smith" />
<Details DGGroup="Production" DGName="Released to Production" DGDate="09/18/2015" DGUser="Fred Smith" />
<Details DGGroup="Production" DGName="At Printers" DGDate="" DGUser="" />
<Details DGGroup="Production" DGName="Packaged" DGDate="" DGUser="" />
<Details DGGroup="Delivery" DGName="Delivery Packet Made" DGDate="09/18/2015" DGUser="Fred Smith" />
<Details DGGroup="Invoice" DGName="Invoiced" DGDate="" DGUser="" />
</TrackingDetails>
有什么想法吗?TIA!
这里有一种方法。
DGGroup的第一组结果
然后仅当位置=1 时打印组名
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:key name="groups" match="/TrackingDetails/Details" use="@DGGroup" />
<xsl:template match="/TrackingDetails">
<table id="Details">
<tr class="heading">
<th scope="col">DGGroup</th>
<th scope="col">DGName</th>
<th scope="col">DGDate</th>
<th scope="col">DGUser</th>
</tr>
<xsl:apply-templates select="Details[generate-id() = generate-id(key('groups', @DGGroup)[1])]"/>
</table>
</xsl:template>
<xsl:template match="Details">
<xsl:for-each select="key('groups', @DGGroup)">
<tr>
<xsl:choose>
<xsl:when test="position()=1">
<td><xsl:value-of select="@DGGroup"/></td>
</xsl:when>
<xsl:otherwise>
<td></td>
</xsl:otherwise>
</xsl:choose>
<td><xsl:value-of select="@DGName"/></td>
<td><xsl:value-of select="@DGDate"/></td>
<td><xsl:value-of select="@DGUser"/></td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>