De sous-Chaîne dans xsl
Salut, je suis à la conversion de XML vers un autre XML à l'aide de XSL.
Le problème que j'ai est la valeur à l'intérieur de la balise est 10feb2011
j'.e <date>10feb2011</date>
.
J'ai besoin de la sortie:
<date>10</date>
<month>feb</month>
<year>2011</year>
j'ai donc utilisé substring
fonction, mais ne pouvait pas le faire fonctionner.
Mon XML ressemble à
<ArrivalDateTime>
<Date>20feb2011<Date>
</ArrivalDateTime>
Il doit être converti dans ce format
<ArrivalDateTime>
<dayOfMonth>10</dayOfMonth>
<month>feb</month>
<year>2011</year>
</ArrivalDateTime>
Ci-dessous est le XSL j'ai écrit
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:text><![CDATA[<ArrivalDateTime>]]></xsl:text>
<xsl:text><![CDATA[<dayOfMonth>]]></xsl:text>
<xsl:value-of select='substring("<xsl:value-of select="/ArrivalDateTime/Date"/>",1,2)'/>
<xsl:text><![CDATA[</dayOfMonth>]]></xsl:text>
<xsl:text><![CDATA[<month>]]></xsl:text>
<xsl:value-of select='substring("<xsl:value-of select="/ArrivalDateTime/Date"/>",3,3)'/>
<xsl:text><![CDATA[</month>]]></xsl:text>
<xsl:text><![CDATA[<year>]]></xsl:text>
<xsl:value-of select='substring("<xsl:value-of select="/ArrivalDateTime/Date"/>",5,4)'/>
<xsl:text><![CDATA[</year>]]></xsl:text>
<xsl:text><![CDATA[</ArrivalDateTime>]]></xsl:text></xsl:template>
</xsl:stylesheet>
- Voici une bonne règle de base: Si vous êtes relativement nouveau à XML et XSLT, et que vous utilisez des sections CDATA, vous êtes probablement fait quelque chose de mal.
Vous devez vous connecter pour publier un commentaire.
Votre XSLT semble trop compliqué. Il suffit de créer les nœuds XML comme ça:
Vous ne devriez pas être en utilisant des sections CDATA pour créer des nœuds XML dans votre document de sortie. C'est inutile et potentiellement dangereux car il permet la génération de XML non valide.
Veuillez noter que bien que l'intérieur des expressions XPath comme dans le
select
les attributs, vous devez écrire XPath valide. Balises XML ne sont pas autorisés ici.Préférable de vérifier certains XSLT tutoriel pour obtenir commencé.
substring('/ArrivalDateTime/Date',1,2)
devrait êtresubstring(/ArrivalDateTime/Date,1,2)
.Votre sous-chaîne de la syntaxe n'est pas tout à fait correct. Vous avez besoin d'utiliser 6,4 (pas 5,4) pour l'année de sous-chaîne. Aussi, vous n'avez pas besoin d'utiliser
xsl:text
à émettre des balises xml.Essayez plutôt ceci:
Alternative:
Vous pouvez même utiliser une variable pour contenir la date, qui est un peu plus soignée:
ArrivalDateTime
élément qui est plus sémantiquement correct?Je me rends compte de ce fil est vieux et il n'y a probablement pas besoin d'ajouter une autre réponse.
Cependant, je ne peux pas aider mais pinaille que les réponses précédentes, bien que techniquement correct pour ce fragment XML, ne fonctionnent pas si ce fragment XML faisaient partie d'un document plus volumineux. En d'autres termes, ces solutions match sur le nœud racine "/", et donc ne fonctionne que lorsque ArrivalDateTime est le nœud racine du document. De façon réaliste, ce ne sera probablement jamais le cas.
Une copie récursive serait un plus solution adaptable:
Vous avez la bonne idée, mais les choses ont un peu mélangé. Il ressemble vous vous attendez à certaines pièces de la transformation XSLT à être évaluée comme il est la diffusion de "texte".
Dans votre XSLT, vous êtes en train de construire nœuds qui sera sérialisée comme XML.
Cette transformation va produire le résultat désiré.