D'analyse et de stocker des valeurs dans la matrice de XSLT 1.0
Merci d'avance pour votre soutien. J'étais juste coincé avec un problème et essayé beaucoup de choses dans tous les sens.
J'ai une transformation XSLT 1.0 besoin d'analyser la valeur d'une balise xml par une virgule et de le stocker dans un tableau.
<OPTIONS>val1,,val2,val3,,,val4</OPTIONS>
Ici, j'ai besoin d'analyser le champ des OPTIONS valeur par une virgule, puis le stocker dans un tableau. Ici, j'ai été coincé avec la manière de les stocker dans la gamme pour une utilisation ultérieure.
S'il vous plaît conseils
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text" omit-xml-declaration="yes"/>
<xsl:variable name="inline-array">
<!--<Item>A</Item>
<Item>B</Item>
<Item>C</Item>-->
<xsl:call-template name="splitByComma">
<xsl:with-param name="str" select="OPTIONS"/>
</xsl:call-template>
</xsl:variable>
<xsl:template match="/">
<xsl:param name="array" select="document('')/*/xsl:variable[@name='inline-array']/*"/>
<xsl:value-of select="$array[1]"/>
</xsl:template>
<xsl:template name="splitByComma">
<xsl:param name="str"/>
<xsl:choose>
<xsl:when test="contains($str,',')">
<item><xsl:value-of select="substring-before($str,',')"/></item>
<xsl:call-template name="splitByComma">
<xsl:with-param name="str"
select="substring-after($str,',')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<item><xsl:value-of select="$str"/></item>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Vous devez vous connecter pour publier un commentaire.
Je pense que cela ne pouvait pas fonctionner en XSLT 1.0, car lorsque vous essayez de charger le contenu de la variable inline-tableau à partir de la feuille de style (c'est à dire
<xsl:param name="array" select="document('')/*/xsl:variable[@name='inline-array']/*"/>
) vous charger de sa définition. Ainsi, il contient l'élément<xsl:call-template...
avec enfant<xsl:with-param...
pas le résultat de l'évaluer.Dans ce cas, vous avez deux options:
(1) Emploient certains d'étendre les fonctions comme xxx:node-set() si votre processeur xslt soutenir
Par exemple, si vous utilisez MS processeur vous pouvez ajouter son espace de noms dans le document de l'élément de votre feuille de style:
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
.L', vous pouvez appeler la fonction
node-set()
de cet espace de noms:<xsl:variable name="array" select="msxsl:node-set($inline-array)/item" />
. Cela permettra de traiter votre variable dans l'ensemble de nœuds de laquelle vous pouvez accéder en un autre document xml:<xsl:value-of select="$array[3]"/>
.D'autres fournisseurs pourraient également avoir une telle extension de regarder la documentation de votre processeur. Ou regarder "exslt".
(2) Vous pouvez aussi faire un autre récursive nommée modèle en prenant une position d'une valeur dans un fichier csv chaîne. Il serait de retour juste valeur à la position spécifiée. Mais il pourrait être un peu cher pour plus de données - cela dépend de vos entrées.
(3) Commutateur de xslt 2.0 où ces choses est beaucoup plus facile
Vous pouvez utiliser marquer() fonction xslt 2.0
<Item>
séquence et ne fait rien de plus il lit aussi la séquence des éléments à partir de votre feuille de style et ne fait rien de plus avec eux. Il n'a pas d'importance si la variable est globale ou non. Pour la fonction document() de votre fichier xslt est juste un fichier xml avec pas de signification particulière.