2010-06-16 113 views
1

if塊以下,我想測試@Timestamp是否小於之前的Message的時間戳。我怎樣才能做到這一點?XSL - 獲取之前元素的屬性

<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> 
+0

@Chris:請發一些XML輸入文件。 – 2010-06-16 14:13:38

+0

@Alejandro - Added – Chris 2010-06-16 15:36:45

+0

如果您提供的代碼塊是您提供的示例xml,那麼這就是所需的行爲,即第一個和第三個輸出。看看時間戳變化。 另外,$ ctimestamp的值是多少? – Meiscooldude 2010-06-16 15:44:36

回答

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

忘記有關XPath Axeses, 但也許它應該是 @timestamp <前同輩::消息[位置()+ 1]/@時間戳 取決於什麼XPath的選擇給我們。 – Meiscooldude 2010-06-16 14:46:24

+0

請參閱我的更新,我嘗試了您的實現以及當前在我的更新代碼中列出的實現。我也試過@ Meiscooldude的變體 – Chris 2010-06-16 15:37:19

+0

@Chris:請參閱我更新的答案。 – 2010-06-16 20:39:38

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> 
+0

請參閱我的更新 – Chris 2010-06-16 15:36:09