Question

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 générer un élément résultant formaté à l'aide de XSLT 1.0.

Étant donné le code XML suivant:

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

Il serait bon de produire le xml résultant:

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

Toutefois, si le XML source contient un format d'heure sur 24 heures non valide, l'élément dstTime résultant doit être vide.

Par exemple, lorsque le code source source non valide est le suivant:

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

Le fichier XML résultant doit être:

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

La question est la suivante: quel est le fragment best XSLT 1.0 qui pourrait être écrit pour produire les résultats souhaités? L’espoir serait de rester assez simple et de ne pas avoir à analyser chaque élément du temps (c’est-à-dire que l’appariement des motifs serait doux si possible).

Était-ce utile?

La solution

Il n’existe pas d’expressions régulières dans XSLT 1.0. Je crains donc que la correspondance des modèles ne soit pas possible.

Je ne sais pas si <srcTime>23:00</srcTime> est censé être légal ou non? Si c'est le 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>

Si ce n'est pas le cas et que quatre chiffres est la seule chose qui soit légale, alors:

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

Autres conseils

XSLT 1.0 ne prend pas en charge de manière standard la manipulation de date / heure.

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

XSLT est vraiment conçu pour les transformations d’arbres. Ce type de manipulation de nœud de texte s’effectue mieux en dehors de XSLT.

En fonction du processeur xslt réellement utilisé, vous pouvez effectuer les opérations souhaitées dans la fonction d'extension personnalisée (à effectuer vous-même).

Xalan prend bien en charge les fonctions d'extension , vous pouvez les écrire non uniquement en Java, mais également en JavaScript ou dans d'autres langues prises en charge par Apache BSF .

Le moteur XSLT de Microsoft prend également en charge les extensions personnalisées, comme décrit dans .NET Framework. Guide du développeur, Extension des feuilles de style XSLT

Regardez: http://www.exslt.org/ spécifiquement les & dates et heures " section. Je n'y ai pas encore plongé, mais on dirait que c'est peut-être ce que vous recherchez.

Même la fonction exslt.org time () ne vous aidera pas ici, car elle s'attend à ce que ses entrées soient au format correct (xs: dateTime ou xs: time).

Il est préférable de résoudre ce problème en dehors de XSLT. Je dis cela en tant que personne qui utilise régulièrement XSLT pour faire des choses pour lesquelles elle n'a pas été vraiment conçue et parvient à faire fonctionner les choses. Il n’était vraiment pas conçu pour analyser les chaînes.

La solution idéale consiste à réparer ce qui produit le document XML de manière à ce qu'il formate les temps à l'aide de la norme internationale établie dans ce but, en partant du principe que vous ne devez pas conserver ou transmettre des données merdales si vous pouvez éviter de le faire. .

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

Pour que la liste soit complète, il existe également le module de traitement de la date et de l'heure . partie de la bibliothèque standard XSLT de Steve Ball.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top