2010-06-16 2 views
1

Dans le bloc if ci-dessous, je souhaite également tester si @Timestamp est plus petit que l'horodatage précédent Message. Comment puis-je atteindre cet objectif?XSL - Obtenir l'attribut de l'élément précédent

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

Exemple 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> 

Mise à jour: J'ai mis en œuvre les variations des réponses actuelles, mais à pas de chance. Il ne semble toujours pas fonctionner correctement pour les deuxièmes éléments, en ce sens qu'il mettra en gras le premier correctement mais pas plus (bien que parfois il fera le troisième). Mise à jour du code de bloc if ci-dessous.

<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: envoyez un document d'entrée XML, s'il vous plaît. –

+0

@Alejandro - Ajouté – Chris

+0

Si vous fournissez mon bloc de code l'exemple xml que vous avez fourni, alors c'est le comportement souhaité, la sortie sur le premier et le troisième. Regardez le changement d'horodatage. aussi, quelle est la valeur de $ ctimestamp? – Meiscooldude

Répondre

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

oublié XPath Axeses, , mais il faudrait peut-être @Timestamp < preceding-sibling :: Message [Position() + 1]/@ Timestamp en fonction de ce que XPath choisit de nous donner. – Meiscooldude

+0

S'il vous plaît voir ma mise à jour, j'ai essayé votre mise en œuvre ainsi que celui actuellement répertorié dans mon code mis à jour. J'ai également essayé la variation @ Meiscooldude – Chris

+0

@Chris: S'il vous plaît voir ma réponse à jour. –

0

Je ne l'ai pas testé cette solution, mais cela ne devrait pas vous.

<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

S'il vous plaît voir ma mise à jour – Chris

Questions connexes