XSL - 获取前一个元素的属性

时间:2010-06-16 13:47:20

标签: xml xslt xpath

在下面的if块中,我还要测试@Timestamp是否小于之前的Message时间戳。我怎样才能做到这一点?

<xsl:for-each select="Message">
    <xsl:sort select="position()" data-type="number" order="descending"/>
    <xsl:variable name="newclass">
        <xsl:if test="@Timestamp + 60 &gt; $ctimestamp">new</xsl:if>
    </xsl:variable>

    <tr><td class="debugtime">
        <xsl:value-of select="@Time"/>
    </td><td class="{$newclass}">
        <xsl:value-of select="node()"/>
    </td></tr>
</xsl:for-each>

示例XML

<Message Time="2010/06/17 04:23:32" Timestamp="1276773812">message1</Message>
<Message Time="2010/06/17 04:23:32" Timestamp="1276773812">message2</Message>
<Message Time="2010/06/17 04:23:33" Timestamp="1276773813">message3</Message>
<Message Time="2010/06/17 04:23:33" Timestamp="1276773813">message4</Message>

更新: 我已经实现了当前答案的两种变体,但没有运气。从第二个元素开始,它似乎总是不能正常工作,因为它会正确地加粗第一个元素,但不会更多(尽管有时它会做第三个元素)。更新了下面的if广告代码。

<xsl:if test="@Timestamp + 60 &gt; $ctimestamp">
    <xsl:if test="position() = 1">
        new
    </xsl:if>
    <xsl:if test="position() != 1 and ../Message[position()-1]/@Timestamp - 1 &lt; @Timestamp">
        new
    </xsl:if>
</xsl:if>

2 个答案:

答案 0 :(得分:0)

@Timestamp &lt; preceding-sibling::Message[1]/@Timestamp

答案 1 :(得分:0)

我没有测试过这个解决方案,但这应该是你。

<xsl:for-each select="Message">
    <xsl:sort select="position()" data-type="number" order="descending"/>

    <xsl:variable name="newclass">
      <xsl:if test="position() != 1">
         <xsl:if test="..\Message[position()-1]@Timestamp &lt; @Timestamp">new</xsl:if>
      </xsl:if>
      <xsl:if test="position() = 1">
         new
      </xsl:if>
    </xsl:variable>

   <tr><td class="debugtime">
       <xsl:value-of select="@Time"/>
   </td><td class="{$newclass}">
       <xsl:value-of select="node()"/>
   </td></tr>

</xsl:for-each>