Aller au contenu

XSLT & Xalan


Messages recommandés

Je dois effectuer une transformation XSL qui fait appel à une classe Java. La méthode Java que j'appelle est la suivante :

public class SimpleTransco {

void transcode(String transcoId, String value) {
...
}
}

public class ComplexTransco {

void transcode(String transcoId, String value, String partenanireSrc, String partenaireDst) {
...
}
}

Je voudrais factoriser un peu mon code, et avoir un truc du genre

public abstract class Transco {

void transcode(List<String> args) {
 doTranscode(List<String> args);
}

abstract void doTranscode(List<String> args);
}

public class SimpleTransco extends Transco {

void doTranscode(List<String> args) {
...
}
}

public class ComplexTransco extends Transco {

void doTranscode(List<String> args) {
...
}
}

Actuellement, j'appelle mes fonctions avec un truc du genre ;

 ...
<xsl:template match="/" xmlns:customfunctions="xalan://monpackage.SimpleTransco">
		<xsl:variable name="valeur" select="//valeur" />
		<pays>
			<xsl:value-of select="customfunctions:transcodification('TRANSCO_1', $valeur')" />
		</pays>
</xsl:template>

...

 ...
<xsl:template match="/" xmlns:customfunctions="xalan://monpackage.ComplexTransco">
		<xsl:variable name="valeur" select="//valeur" />
		<pays>
			<xsl:value-of select="customfunctions:transcodification('TRANSCO_1', $valeur, 'PARTICIPANT_A', 'PARTICIPANT_B')" />
		</pays>
</xsl:template>

...

Le problème, c'est que je ne sait pas comment passer une liste d'arguments à une fonction XSL.

Lien vers le commentaire
Partager sur d’autres sites

Je ne pense pas qu'il soit possible de récupérer directement une liste de string. Les types (non scalaires) supportés par Xalan sont org.w3c.dom.traversal.NodeIterator ou org.w3c.dom.NodeList. Donc tu dois pouvoir faire un truc du genre :

public abstract class Transco {

void transcodeFromXml(NodeIterator args) {
 List<String> values = new List<String>;
 for(Node n: args) {
if(n.getNodeType() == Node.TEXT_NODE)
  values.add(n.getNodeValue());
 }

 doTranscode(values);
}

void transcode(List<String> args) {
 doTranscode(List<String> args);
}

abstract void doTranscode(List<String> args);
}

Et du coup dans le XSL :

	<xsl:template match="/" xmlns:customfunctions="xalan://monpackage.SimpleTransco">
		<xsl:variable name="valeur" select="//valeur" />
		<pays>
			<xsl:value-of select="customfunctions:transcodeFromXml($valeur)" />
		</pays>
</xsl:template>

Lien vers le commentaire
Partager sur d’autres sites

  • 4 mois après...

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...