2010-06-16 4 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> 

Update: Я реализовал обе вариации текущих ответов, но на не повезло. Кажется, что он не работает должным образом для вторых элементов вперед, потому что он будет сначала перенести первый, но не более (хотя иногда он будет делать третий). Обновлен 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

@ Крис: напишите какой-нибудь документ на основе XML, пожалуйста. – 2010-06-16 14:13:38

+0

@Alejandro - Добавлено – Chris

+0

Если вы предоставляете мой блок кода пример xml, который вы предоставили, то это желаемое поведение, выводящее на первом и третьем. посмотрите на изменение метки времени. также, что такое значение $ ctimestamp? – Meiscooldude

ответ

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

Забыв об XPath Axeses, , но, возможно, это должно быть @Timestamp < предшествующее-родственный :: Сообщение [позиция() + 1]/@ Отметка в зависимости от того, что XPath выбирает, чтобы дать нам. – Meiscooldude

+0

См. Мое обновление, я попробовал вашу реализацию, а также версию, указанную в моем обновленном коде. Я также попробовал вариант @ Meiscooldude – Chris

+0

@Chris: Пожалуйста, см. Мой обновленный ответ. –

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

Смежные вопросы