Convertir le format de date / heure dans XSLT
J'ai une valeur de date dans un champ dans le fichier XML dans le format suivant:
<Date value="4/1/2013 5:13:41 PM"/>
Je veux le convertir en un format XSD standard:
2013-04-01T17:13:41.000Z
Comment puis-je faire dans ma transformation XSL? Je peux utiliser les deux 1.0 et 2.0 versions de la feuille de style.
Il existe un certain nombre de question avec réponse disponibles pour le format de date. Avez-vous vu et essayé?
Ça dépend un peu si 4/1/2013 est le 4 janvier, soit le 1er avril. Mais essentiellement, il n'y a pas de réponse simple, il vous suffit d'analyser les composants de la date à l'aide de la manipulation de chaînes (regexes dans XSLT 2.0) et puis remonter la chaîne dans le bon ordre. Fastidieux, mais pas difficile.
Il est clair à partir de la date ISO chaîne de temps que la date est le 1er avril.
Ça dépend un peu si 4/1/2013 est le 4 janvier, soit le 1er avril. Mais essentiellement, il n'y a pas de réponse simple, il vous suffit d'analyser les composants de la date à l'aide de la manipulation de chaînes (regexes dans XSLT 2.0) et puis remonter la chaîne dans le bon ordre. Fastidieux, mais pas difficile.
Il est clair à partir de la date ISO chaîne de temps que la date est le 1er avril.
OriginalL'auteur Rg90 | 2013-06-13
Vous devez vous connecter pour publier un commentaire.
Donc...je me suis ennuyé et n'avais pas joué avec xsl:analyser-chaîne avant. Voici une regex solution basée sur :
J'ai couru ce à l'encontre d'un fichier xml test comme ceci :
Et la sortie est ceci :
Si vous voulez formater la sortie plus précisément, comme l'a déjà recommandé, vous pouvez utiliser le format-fonction date.
<xsl:variable name="dateTime"><xsl:value-of select="..."/></xsl:variable>
à<xsl:variable name="dateTime" select="..."/>
.Juste point de. Édité de façon appropriée.
Je vais donner à ceci un essai! Merci!
Une grande réponse, sauf pour 1 point. Vous avez manqué l'12H -> 00HH de conversion. Vous pouvez remplacer "nombre(regex-groupe de(4))" par "nombre(regex-groupe de(4)) mod 12" dans l'autre partie pendant des heures
De la merde ne fonctionne pas de la version 1.0. Vous doo doo. Tout droit jusqu'doo doo comme vous le faites.
OriginalL'auteur adhocgeek
Voici un XSLT 1.0 version, à l'aide de
substring-before
etsubstring-after
.Grâce à
adhocgeek
pour le XML d'entrée.XML
sortie
Pendant que je suis ici: ce résultat est incorrect:
5:13:41 PM
besoin d'être transformée en17:13:41
. Sinon, la sortie sera de 12 heures plus tôt que l'entrée.OriginalL'auteur Borodin
Ont un coup d'oeil à ESXLT. De nombreux XSL implémentations prennent déjà en charge les fonctions de la boîte, et ils fournissent des issues dans le cas où le vôtre ne le supporte pas.
Si vous avez entièrement conformes à la mise en œuvre, vous pouvez le faire:
J'ai triché et utilisé le résultat de
date:parse
directement. On utilise souvent ledate:format
fonction pour formater la date dans un format particulier.Honnêtement, je n'ai eu du mal à obtenir que le "repli" des fonctions de EXSLT de travail pour moi dans Apache Xalan. (L'aide non-core EXSLT les fonctions de date avec Xalan Java)
De l'OMI, il serait mieux d'avoir la date en
xs:dateTime
format en premier lieu, et de les convertir à certains localisée format par la suite. Vous pouvez utiliser ledate:format
fonction pour formater la date et l'date:format
fonction jouit beaucoup plus large soutien parmi les processeurs XSLT.Félicitations, je suis corrigé. Mais le processeur prend en charge cette fonction "out of the box"? Je ne sais pas du tout.
Ouais, je ne pense pas qu'il y en a, honnêtement. Je n'ai pas vérifié pour voir si le "repli" des options fournies par ESXLT de travail pour
parse-date
. Si à l'aide de Xalan-Java, vous pouvez utiliser la technique que j'ai utilisé dans stackoverflow.com/questions/22081400/... et d'analyser-et-reformater la date vous-même. Mieux à l'aide dexs:dateTime
dates dans votre XML en premier lieu.Le
<xsl:fallback>
élément est conçu pour gérer , pas fonctions. Pour les fonctions, utilisez lafunction-available()
fonction.Je suis peut être bâclée avec mon nomenclature: je voulais dire ESXLT "autres options" pour l'utilisation de leurs fonctions lorsque le XSLT mise en œuvre ne fournit pas d'eux... pas que
<xsl:fallback>
doit être utilisé.OriginalL'auteur Christopher Schultz
À l'aide de XSLT 2.0, vous pouvez construire un
xs:dateTime
valeur par l'extraction des composants deDate/@value
à l'aide de fonctions de chaînes de caractères, alors vous pouvez mettre en forme si besoin à l'aide deformat-dateTime
: http://www.w3.org/TR/xslt20/#format-date. L'extraction de la date des composants tels que l'année, le mois, le jour doit être simple, évidemment, pour le moment, vous avez besoin de travailler un peu plus d'attention à laPM
ouAM
horloge de 12 heures.OriginalL'auteur Martin Honnen
@adhockgeek réponse travaillé presque parfaitement pour moi. Je n'ai eu qu'à ajouter une condition de sorte qu'il ne pas ajouter de 12 à l'heure, si la valeur était de 12 actuellement. C'EST À DIRE, 12:15 PM != 24:15 AM.
J'ai créé un modèle à partir de son code qui peut être appelé à plusieurs reprises à l'intérieur d'une transformation:
OriginalL'auteur Bruce Bacher
Code avec sous-chaîne-avant et de la sous-chaîne-après les travaux, mais plus de contrôles doit être ajoutée:
12H => 00 et 12 H => 12 à quelque chose comme ceci:
OriginalL'auteur Yuri Shapovalov