2010-08-04 6 views
3

J'utilise un code pour soustraire une date à partir de l'autre en utilisant XSLT 2.0:Comment convertir une durée de date XSLT 2.0 en chaîne?

<xsl:template match="moveInDate"> 
    <xsl:value-of select="current-date() - xs:date(.)"/> 
</xsl:template> 

Cela fonctionne, mais il me laisse une réponse de P2243D, que je suppose correspond à une « période de 2243 Jours » (ce qui est correct en termes de mathématiques). Puisque j'ai seulement besoin du nombre de jours, pas du P et du D, je sais que je pourrais utiliser la sous-chaîne ou quelque chose de similaire, mais en tant que novice de XSLT, je suis curieux de savoir s'il y a une meilleure façon pour ce faire, que la manipulation de chaîne simple.

Répondre

7

Vous pouvez simplement utiliser fn:days-from-duration() pour obtenir la durée comme xs:integer:

days-from-duration($arg as xs:duration?) comme xs:integer?

Retourne un xs:integer représentant la composante jours dans la représentation lexicale canonique de la valeur de $arg. Le résultat peut être négatif.

Voir la spécification XQuery 1.0 and XPath 2.0 Functions and Operators pour plus d'informations.

Dans votre cas:

<xsl:template match="moveInDate"> 
    <xsl:value-of select="days-from-duration(current-date() - xs:date(.))"/> 
</xsl:template> 

Hope this helps!

EDIT: Vous pouvez également le faire comme vous le dites, avec traitement de sous-chaîne. Mais comme vous le dites, ce n'est pas préférable. Si, pour une raison quelconque, vous souhaitez faire quelque chose de similaire, vous devez penser aux types de données. Le résultat de current-date() - xs:date(.) est retourné comme xs:duration qui ne peuvent pas être traitées par les fonctions de sous-chaîne sans être casted:

<xsl:template match="moveInDate"> 
    <xsl:variable name="dur" select="(current-date() - xs:date(.)) cast as xs:string"/> 
    <xsl:value-of select="substring-before(substring-after($dur, 'P'), 'D')"/> 
</xsl:template> 
+0

+1 Bon et étendre réponse! Aussi pour relier les spécifications. –

+0

Belle réponse, merci beaucoup. Maintenant, si je peux juste comprendre ma prochaine question: Comment répondre moi-même la prochaine fois ... – mlissner