XSL:IF不重复html表列中的值(前面的同级?)

  • 本文关键字:前面 IF html XSL xslt-1.0
  • 更新时间 :
  • 英文 :


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

最新更新