2014-04-29 5 views
2

Je travaille avec un système qui affiche uniquement l'heure du serveur dans le fuseau horaire central (CT). J'ai besoin de convertir ceci en XSLT en US Eastern Time.Conversion de fuseau horaire XSLT

Existe-t-il une méthode intégrée pour traduire ceci ou dois-je utiliser Regex?

<node time="02:14 pm CT" /> 

Courant de sortie: 14h14 CT

sortie souhaitée: 15:14 ET

+0

signifie "CT" [Time Zone centrale] (http://en.wikipedia.org/wiki/Central_Time_Zone_%28North_America%29)? Si c'est le cas, vous n'avez besoin d'ajouter qu'une heure à l'heure donnée pour la convertir en fuseau horaire de l'Est (en supposant que vos régions d'intérêt observent les mêmes règles d'heure d'été). Utilisez-vous XSLT 1.0 ou 2.0? –

+0

Oui, fuseau horaire central. XSLT 1.0 – RegEdit

+0

Pouvez-vous poster un exemple de l'entrée XML? –

Répondre

1

Vous avez le choix entre au moins deux chemins principaux, en le convertissant en temps et en utilisant une bibliothèque basée sur le temps, ou en le prenant comme une chaîne et en effectuant une manipulation de chaîne droite. Ce qui suit est la manipulation de chaînes:

<xsl:variable name="time" select="'11:14 pm CT'"/> <!-- the input value --> 
    <xsl:variable name="hours" select="number(substring-before($time,':'))"/> <!-- numeric hours --> 
    <xsl:variable name="mer" select="substring($time,7,2)"/> <!-- the am or pm part --> 

    <xsl:choose> 
     <xsl:when test="$hours &lt; 12"> <!-- if we are 01-11 --> 
      <xsl:value-of select="substring(concat('0', $hours + 1), string-length(concat('0', $hours + 1)) - 1, 2)"/> <!-- add an hour and repad the string with leading zero, messy --> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:text>01</xsl:text> <!-- we were 12, so just use 01 --> 
     </xsl:otherwise> 
    </xsl:choose> 
    <xsl:value-of select="substring($time, 3,4)"/> <!-- pull the minutes forward --> 
    <xsl:choose> 
     <xsl:when test="not($hours = 11)"> <!-- if we were not 11 for hours we keep the same am/pm --> 
      <xsl:value-of select="$mer"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:choose> 
       <xsl:when test="$mer = 'pm'"> <!-- otherwise we flip it --> 
        <xsl:text>am</xsl:text> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:text>pm</xsl:text>      
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:otherwise> 
    </xsl:choose> 
    <xsl:text> ET</xsl:text> 
+0

+1 Travaux. Serait mieux si elle était convertie en une fonction réutilisable/call-template. Cela lui permettrait d'être plus facilement utilisé en ligne avec du texte. "Votre demande a été reçue sur [call-template] et sera traitée." – RegEdit

+0

Envelopper ceci dans un modèle nommé serait possible. À ce stade, il vaudrait probablement la peine de modifier la logique afin qu'elle puisse gérer les décalages variables plutôt que le décalage d'une heure fixe par rapport à ET. –

1

Il n'y a pas de méthode intégrée pour cela dans XSLT 1.0. Quoi qu'il en soit, cela aurait été plutôt trivial à faire - sauf pour le fait que votre entrée de temps est au format 12 heures. Cela rend le processus assez fastidieux, donc je l'ai divisé le tout à un modèle de traitement:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/"> 
    <node> 
     <xsl:attribute name="time"> 
      <xsl:call-template name="time-offset"> 
       <xsl:with-param name="time" select="node/@time"/> 
      </xsl:call-template> 
     </xsl:attribute> 
    </node> 
</xsl:template> 

<xsl:template name="time-offset"> 
    <xsl:param name="time"/> 
    <xsl:param name="offset" select="1"/> 
    <xsl:param name="h12" select="substring($time, 1, 2)"/> 
    <xsl:param name="pm" select="contains($time,'p') or contains($time,'P')"/> 
    <xsl:param name="h24" select="$h12 mod 12 + 12*$pm"/> 
    <xsl:param name="newH24" select="($h24 + $offset + 24) mod 24"/> 
    <xsl:param name="newH12" select="($newH24 + 11) mod 12 + 1"/> 
    <xsl:param name="am.pm" select="substring('AMPM', 1 + 2*($newH24 > 11), 2)"/> 
    <xsl:value-of select="concat(format-number($newH12, '00'), substring($time, 3, 4), $am.pm, ' ET')"/> 
</xsl:template> 

</xsl:stylesheet> 

Lorsque la feuille de style ci-dessus est appliqué à l'entrée exemple:

<node time="12:14 am CT" /> 

le résultat est:

<?xml version="1.0" encoding="UTF-8"?> 
<node time="01:14 AM ET"/> 
Questions connexes