XSL:如果不重复html表列中的值(previous-sibling?)

时间:2015-11-12 03:51:08

标签: xslt-1.0

在任何其他语言中,我可以将前一行的值存储在变量中,然后查看它是否与当前值匹配,但是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!

1 个答案:

答案 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>