Creation d'un element en XSLT

Résolu/Fermé
pierre.inalco Messages postés 9 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 24 mai 2008 - 22 mai 2008 à 17:12
pierre.inalco Messages postés 9 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 24 mai 2008 - 24 mai 2008 à 01:07
Bonjour à tous,

je suis en train de transformer un document XML via une feuille de style XSL.
Mon problème est le suivant :
je veux créer un nouvel élément dont le nom serait les trois premiers caractères d'un attribut du document XML source.

<xsl:template match="element1">
	<xsl:copy>
		<xsl:for-each select="element2">
		<xsl:element name="{substring(@att1,1,3)}">
		<xsl:value-of select="@att2" />
		</xsl:element>
		</xsl:for-each>
	</xsl:copy>
</xsl:template>


J'ai comme message d'erreur : ERROR: Description: To create nodes of type 'ELEMENT', a valid name must be specified.
(XML Cooktop)


Le plus étrange c'est que si je rajoute un caractère devant l'expression {substring(@att1,1,3)}, la transformation marche sans problème :

<xsl:template match="element1">
	<xsl:copy>
		<xsl:for-each select="element2">
		<xsl:element name="X{substring(@att1,1,3)}">
		<xsl:value-of select="@att2" />
		</xsl:element>
		</xsl:for-each>
	</xsl:copy>
</xsl:template>


me donne dans mon XML de sortie :

<Xatt1>
att2
</Xatt1>


Si quelqu'un à une autre solution que rajouter un caractère dont je n'ai pas besoin, je suis preneur !
Merci d'avance...
A voir également:

1 réponse

pierre.inalco Messages postés 9 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 24 mai 2008
24 mai 2008 à 01:07
Je viens de trouver l'origine de l'erreur.
La valeur de l'attribut d'un des éléments que j'essayais de récupérer était la chaîne vide.
Le processeur ne pouvait donc pas créer un nouvel élément sans nom.
Pour remédier à cela, j'ai modifié le code de sorte que le processeur ignore ce type de cas :

<xsl:template match="element1[string(@att1)]">
	<xsl:copy>
		<xsl:for-each select="element2">
		<xsl:element name="{substring(@att1,1,3)}">
		<xsl:value-of select="@att2" />
		</xsl:element>
		</xsl:for-each>
	</xsl:copy>
</xsl:template>
-1