Knoten an Java-Methode übergeben mit XALAN-Extension

gregorweber

Grünschnabel
Hallo NG,
ich habe ein Element das als Child das Element DBINFO hat. Dieses hat wiederum weitere Childelemente. Siehe Ausschnitt aus der XML-File:

<ELMENT1>
<DBINFO>
<user>test</user>
<passwort>wirdnichtverraten</passwort>
etc.
</DBINFO>
</ELMENT1>

Ich habe nun in einem XSL-stylesheet ein template für das ELEMENT1. In dem möchte ich nun den Node DBINFO samt seinen Child(ren) an eine Java Methode übergeben. Wie muss ich das angehen? Wie ich einzelen Werte an eine Methode übergebe ist mir klar. Nur nicht wie das mit dem ganzen klappt.
Danke euch schon mal.

mfg Gregor
 
Hallo!

Java Methode aus XSLT aufrufen

Hier mal ein einfaches Beispiel: (Java 5)
in.xml:
Code:
  <?xml version="1.0"?>
  <?xml-stylesheet href="transform.xslt" type="text/xsl"?>
  <root>
  	<elem>1</elem>
  	<elem>2</elem>
  	<elem>3</elem>
  	<elem>4</elem>
  </root>

transform.xslt:
Code:
  <?xml version="1.0"?>
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  	xmlns:xalan="http://xml.apache.org/xalan" 
  	xmlns:example-extension="xalan://de.tutorials.ExampleExtensionAction" >
  	<xsl:template match="/">
  		<xsl:apply-templates/>
  		Summe: <xsl:value-of select="example-extension:process(//elem/text())"/>
  	</xsl:template>
  </xsl:stylesheet>

XSLTExample:
Code:
  /*
   * Created on 04.02.2005@13:24:52
   *
   * TODO Licence info
   */
  package de.tutorials;
  
  import javax.xml.transform.Transformer;
  import javax.xml.transform.TransformerFactory;
  import javax.xml.transform.stream.StreamResult;
  import javax.xml.transform.stream.StreamSource;
  
  /**
   * @author Darimont
   * 
   * TODO Explain me
   */
  public class XSLTExample {
  
  	public static void main(String[] args) throws Exception {
  		new XSLTExample().doIt();
  	}
  
  	/**
  	 * 
  	 */
  	private void doIt() throws Exception {
  		Transformer t = TransformerFactory
  				.newInstance()
  				.newTransformer(
 				new StreamSource(XSLTExample.class
 						.getResourceAsStream("transform.xslt")));
  
  		t
 				.transform(new StreamSource(XSLTExample.class
 						.getResourceAsStream("in.xml")), new StreamResult(
 						"c:/out.xml"));
  	}
  }

ExampleExtensionAction:
Code:
  /*
   * Created on 04.02.2005@13:58:53
   *
   * TODO Licence info
   */
  package de.tutorials;
  
  import org.w3c.dom.NodeList;
  import org.w3c.dom.Text;
  
  /**
   * @author Darimont
   * 
   * TODO Explain me
   */
  public class ExampleExtensionAction {
  
  	public static double process(NodeList list) {
  		if (list != null) {
  			double sum = 0.0D;
 			for (int i = 0, len = list.getLength(); i < len; i++) {
 				Text text = (Text) list.item(i);
 				sum += Double.parseDouble(text.getTextContent());
  			}
  			return sum;
  		} else {
  			return Double.NaN;
  		}
  	}
  }

Das resultierende out.xml:
Code:
  <?xml version="1.0" encoding="UTF-8"?>
  	1
  	2
  	3
  	4
  
  		Summe: 10

HTH,

Gruß Tom
 
Zurück