# byte array in xslt umwandeln



## SpaceMan (11. Sep 2009)

Hallo zusammen, 

ich habe ein "kleines" Problem. Sitze seit 2 Tagen dran und komm nicht weiter. Ich wär sehr dankbar, wenn jemand von euch mir Paar Tipps geben könnte.

Das Problem: 
ein xslt-Dokument wird als byte[] an die Methode übergeben. Diese Methode soll dann die gespeicherten Attributen ausslesen und als liste zurückgeben.

Ich weiß nicht wie das mit dem Auslesen oder auch mit der umwandlung(byte[]-->xslt) funktionieren soll, weil ich nicht viel mit xml und xslt gearbeitet habe. Welchen Parser kann man benutzen?


Schöne Grüße,
Daniel


----------



## SlaterB (11. Sep 2009)

sind die Attribute im xslt drin oder in einer separaten xml-Datei?
wenn in xml, musst du dieses xml dann erst noch mit dem xslt transformieren oder kannst du auch direkt das xml durchsuchen?
Java and XSLT

ein byte[] könntest du in einer Datei zwischenspeichern,
oder per ByteArrayInputStream einen Stream draus machen, den andere Methoden benöigten oder für einen BufferedReader,
um daraus Text zu lesen,
generell wird man so eine Aufgabe ohne Java-Kenntnisse aber nicht lösen können,
wie kommt es denn, dass du sie hast?


----------



## SpaceMan (11. Sep 2009)

SlaterB hat gesagt.:


> sind die Attribute im xslt drin oder in einer separaten xml-Datei?
> wenn in xml, musst du dieses xml dann erst noch mit dem xslt transformieren oder kannst du auch direkt das xml durchsuchen?
> Java and XSLT


Eingabe: typ: String, xslt: byte[]  

Die xslt soll neben die Transformationsregeln auch eine Liste der Parameter/Attribute mit deren Typen enthalten. Also die Daten sollen aus xslt gewonnen werden und nicht aus der xml. Das verwirrt mich. 

Ausgabe: Attributte vom Typ "schlagmichtot" 

Aus einer xml kann man mit ner XPath anfrage die gewünschten Daten bekommen. Läuft es auch so ähnlich bei einer xslt? Wie?  
Die xslt-Datei habe ich noch nicht geschrieben weil ich auf die xml-Datei warten muss.  Das wird auch Lustig. 



SlaterB hat gesagt.:


> ein byte[] könntest du in einer Datei zwischenspeichern,
> oder per ByteArrayInputStream einen Stream draus machen, den andere Methoden benöigten oder für einen BufferedReader,
> um daraus Text zu lesen,
> generell wird man so eine Aufgabe ohne Java-Kenntnisse aber nicht lösen können,
> wie kommt es denn, dass du sie hast?




Ein Profi in Java bin ich nicht, aber ich geb mir Mühe.  
Danke dir für dir Antwort.


----------



## SlaterB (11. Sep 2009)

XSLT ist im Grunde auch nur XML, ein Parser sollte damit was anfangen können,
notfalls als Text Zeile für Zeile einlesen und eben analysieren,

ausgeben und hier posten wäre der erste Schritt


----------



## SpaceMan (13. Sep 2009)

```
public GetAttributeListResponse getAttributeList(GetAttributeListRequest parameters)throws WsChangePatternServiceFault {
		GetAttributeListResponse response = null;

		String type = parameters.getAttributeType();

		byte[] pattern = parameters.getChangePattern();	

		String byteToString = new String(pattern);

		File file = new File (byteToString);

		ByteArrayOutputStream byteArrayOutputStream = new 
ByteArrayOutputStream();

	        FileInputStream fileInputStream=null;
			try {
				fileInputStream = new FileInputStream(file);		
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	        byte[] buffer = new byte[16384];
	        
	        try {
				for (int len = fileInputStream.read(buffer); len > 0; len = fileInputStream.read(buffer)) {
					byteArrayOutputStream.write(buffer, 0, len);
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	 
	        try {
				fileInputStream.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	        try {
		  System.out.println
                      (newString(byteArrayOutputStream.toByteArray(),"UTF-8"));
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		return response;

	}
```


Also ich hab so ne methode geschrieben. Zur Zeit wird aber der Inhalt als System.out.println ausgegeben... Meinste ich bin auf den richtigen Weg? Muss jetzt nur noch herausfinden wie ich aus den Inhlat nur die Attribute rausholen kann. (println hab ich nur zum Testenreingepackt)


----------



## SlaterB (14. Sep 2009)

klingt nach der richtigen Richtung


----------



## SpaceMan (17. Sep 2009)

Hello everybody,


```
public class FileAsByteArrayExample {
	public static void main(String[] args) throws Exception {
		File file = new File("C:/schedule.xsl");
		method0(file);
	}

	private static void method0(File file) throws Exception, IOException,UnsupportedEncodingException {
		FileInputStream fileInputStream = new FileInputStream(file);
		byte[] data = new byte[(int) file.length()];
		Document document = null;

		fileInputStream.read(data);
		fileInputStream.close();
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		factory.setNamespaceAware(true);
		ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
		InputSource isource = new InputSource(byteArrayInputStream);

		DocumentBuilder builder = factory.newDocumentBuilder();
		document = builder.parse(isource);

		// instantiate an XPathFactory
		XPathFactory xpathFactory = XPathFactory.newInstance();

		// use the XPathFactory to crate a new XPath object
		XPath xpath = xpathFactory.newXPath();

		// expr = xpath.compile("//xsl:param");
		// expr1=xpath.compile("/xsl:parm/@name and /xsl:attribute[@name=\"userdefined\"]/../@name");
		// XPathExpression expr = xpath.compile("/xsl:parm/xsl:attribute[@name="userdefined"]/../@name");
		

		String path = "//*";
		
		NodeList nodes= (NodeList) xpath.evaluate(path, document, XPathConstants.NODESET);
		 for (int i = 0; i < nodes.getLength(); i++) {			 
			 System.out.println("Local name: "+nodes.item(i).getLocalName());
			 System.out.println("Node name: "+nodes.item(i).getNodeName());
			 System.out.println("Node type: "+nodes.item(i).getNodeType()+"\n");
		 }
	}
}
```

Ausschnitt aus der xsl-datei:
[XML]<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xslutput method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
     doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>


    <xslaram name="name" select="">
		<xsl:attribute name="userdefined" />
	</xslaram>
	<xsl:template match="/">	
		<xslaram name="id" select="">
			<xsl:attribute name="userdefined" />
		</xslaram>
		<html xmlns="http://www.w3.org/1999/xhtml">
			<head>
				<title>Schedule</title>
			</head>
			<body>
				<h2 align="center">
					<xsl:value-of select="schedule/owner/name/first"/>
					<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
					<xsl:value-of select="schedule/owner/name/last"/>'s Schedule</h2>
				<xsl:apply-templates select="schedule/appointment"/>
			</body>
		</html>
	</xsl:template>......[/XML]


Also was ich brauche sind alle xslaram mit xsl:attribute name="userdefined". Es klappt irg.wie nicht mit den xpath die ich eingegeben habe.... 

Ist es möglich die Infos rauszuhollen auch ohne der NodeList, also nur durch xpath-Anfrage?


Schöne Grüße,
Daniel


----------



## SlaterB (17. Sep 2009)

bringt denn die for-Schelfie schon Ergebnisse, alle Nodes?

>  xpath.compile("/xslarm/xsl:attribute[@nam

ist parm statt param gewollt?
mit XPATH kenne ich mich aber nicht so aus,
dazu gibts doch sicher Tutorials, schön einfach mit TopLevel-Elementen anfangen, nach 2 Wochen langsam an Attribute heranwagen usw


----------

