2008-09-26 8 views
2

J'ai eu du mal à trouver de bons moyens de prendre un format d'heure et de déterminer facilement s'il est valide, puis de produire un élément résultant qui a un formatage en utilisant XSLT 1.0.Quelle est la meilleure façon de formater 24 heures dans XSLT 1.0?

Compte tenu du code XML suivant:

<root> 
    <srcTime>2300</srcTime> 
</root> 

Ce serait formidable pour produire le xml résultant:

<root> 
    <dstTime>23:00</dstTime> 
</root> 

Cependant, si le xml source contient un invalide format 24 heures, le résultat L'élément dstTime doit être vide.

Par exemple, lorsque le xml source non valable est la suivante:

<root> 
    <srcTime>NOON</srcTime> 
</root> 

Le xml résultant devrait être:

<root> 
    <dstTime></dstTime> 
</root> 

La question est, quel est le meilleur fragment XSLT 1.0 qui pourrait être écrit pour produire les résultats souhaités? L'espoir serait de le garder tout à fait simple et de ne pas avoir à analyser chaque partie du temps (c.-à-d., La correspondance des motifs serait douce si possible).

+0

Pourrait aider mais notez que 2400 est une date non valide. Midi est 1200 et minuit est 0000. – dacracot

+0

Quel moteur XSLT utilisez-vous? – Kev

+0

Merci d'avoir signalé l'heure non valide. Woops! A été corrigé depuis. –

Répondre

5

Il n'y a pas d'expressions régulières dans XSLT 1.0, donc j'ai peur que la correspondance de modèle ne soit pas possible.

Je ne sais pas si <srcTime>23:00</srcTime> est censé être légal ou non?Dans ce cas, essayez:

<dstTime> 
    <xsl:if test="string-length(srcTime) = 4 or 
       string-length(srcTime) = 5"> 
    <xsl:variable name="hour" select="substring(srcTime, 1, 2)" /> 
    <xsl:if test="$hour >= 0 and 24 > $hour"> 
     <xsl:variable name="minute"> 
     <xsl:choose> 
      <xsl:when test="string-length(srcTime) = 5 and 
          substring(srcTime, 3, 1) = ':'"> 
      <xsl:value-of select="substring(srcTime, 4, 2)" /> 
      </xsl:when> 
      <xsl:when test="string-length(srcTime) = 4"> 
      <xsl:value-of select="substring(srcTime, 3, 2)" /> 
      </xsl:when> 
     </xsl:choose> 
     </xsl:variable> 
     <xsl:if test="$minute >= 0 and 60 > $minute"> 
     <xsl:value-of select="concat($hour, ':', $minute)" /> 
     </xsl:if> 
    </xsl:if> 
    </xsl:if> 
</dstTime> 

Dans le cas contraire, et quatre chiffres est la seule chose qui est alors juridique:

<dstTime> 
    <xsl:if test="string-length(srcTime) = 4"> 
    <xsl:variable name="hour" select="substring(srcTime, 1, 2)" /> 
    <xsl:if test="$hour >= 0 and 24 > $hour"> 
     <xsl:variable name="minute" select="substring(srcTime, 3, 2)" /> 
     <xsl:if test="$minute >= 0 and 60 > $minute"> 
     <xsl:value-of select="concat($hour, ':', $minute)" /> 
     </xsl:if> 
    </xsl:if> 
    </xsl:if> 
</dstTime> 
3

XSLT 1.0 n'a aucun support standard pour la manipulation de date/heure.

Vous devez écrire une fonction d'analyse et de formatage simple. Ça ne va pas être simple, et ça ne va pas être joli.

XSLT est vraiment conçu pour les transformations d'arbres. Ce genre de manipulations de nœuds de texte est mieux fait en dehors de XSLT.

1

Jetez un oeil à: http://www.exslt.org/ spécifiquement la section "dates et heures". Je n'ai pas creusé profondément mais il semble que ce soit ce que vous cherchez.

1

Même la fonction exslt.org time() ne vous aidera pas ici, car elle s'attend à ce que son entrée soit dans le bon format (xs: dateTime ou xs: time).

C'est quelque chose qui est mieux fixé en dehors de XSLT. Je dis cela comme quelqu'un qui utilise régulièrement XSLT pour faire des choses pour lesquelles il n'était pas vraiment conçu et qui réussit à faire fonctionner les choses. C'était vraiment pas conçu pour analyser les chaînes. La solution idéale consiste à réparer ce qui est en train de produire le document XML afin qu'il formate les temps en utilisant la norme internationale convenablement établie juste à cet effet, en utilisant le principe que vous ne devez pas persister ou transmettre des données de merde si vous pouvez éviter alors.

Mais si ce n'est pas possible, vous devez corriger les données avant de les transmettre à XSLT ou les corriger après avoir généré la sortie de la transformation.

2

En fonction du processeur xslt réel utilisé, vous pourriez être en mesure de faire opérations souhaitées dans la fonction d'extension personnalisée (que vous auriez à faire vous-même).

Xalan a un bon support pour extension functions, vous pouvez les écrire non seulement en Java mais aussi en JavaScript ou dans d'autres langages pris en charge par Apache BSF.

moteur XSLT de Microsoft prend en charge des extensions personnalisées ainsi, comme décrit dans .NET Framework Developer's Guide, Extending XSLT Style Sheets

Questions connexes