在任何其他语言中,我可以将前一行的值存储在变量中,然后查看它是否与当前值匹配,但是XSL中的alas变量实际上并不是“变量”或类似的...... < / p>
那么,我该如何完成应该做的“简单”任务?
我有一些(可能是格式不佳的)XML,由第三方应用程序输出。我使用它将以下每行输出为使用XSL的html表行:
if(value.equals("\"Movie\""))
我希望它只打印每个独特的'DGGroup'一次,但它要么打印所有这些,要么根本不打印。
所以,最后,我喜欢这样的HTML(使用类似于帖子底部的XML):
<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>
并在下一行:
<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">
......两者都不起作用
以下是一些XML的示例:
<xsl:if test="preceding-sibling::*[1]=./@DGGroup">
有什么想法吗? TIA!
答案 0 :(得分:0)
这是一种方法。
首先按DGGroup分组结果
然后仅在position = 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>