XML in C übersetzen

Bei einer XSLT-Datei werden alle elemente in der XML-Datei angelaufen. Existiert ein Template für ein Element, wird es gemäß diesem Template in die Zieldatei geschrieben, existiert kein Template, dann wird einfach es einfach so in die Zieldatei geschrieben.

Bei dir heißt das Template "fehler", aber es gibt kein Element mit diesem Namen, deshalb wird dieses Template ignoriert. Da es aber für die anderen Elemente keine Templates gibt werden diese einfach so in die Zieldatei geschrieben.


MFG

zEriX
 
Hallo,

ich habe jetzt den Fehler in der XSL-Datei korrigiert. Aber das Verhalten hat sich nicht geändert. Es wird weiterhin nicht transformiert.

XSL-Datei

Code:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="parent">Test</xsl:template>
<xsl:template match="child1">1</xsl:template>
<xsl:template match="child2">2</xsl:template>
<xsl:template match="child3">3</xsl:template>

</xsl:stylesheet>

Zieldatei:

Code:
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="style.xsl"?>
<parent>
	<child1>child1</child1>
	<child2>child2</child2>
	<child3>child3</child3>
</parent>

Gruß

Tikonteroga
 
Also ich musste noch
Code:
<xsl:apply-templates/>
bei dem Template für parent schreiben, aber sonst funktioniert es.

XML
Code:
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="style.xsl"?>
<parent>
	<child1>child1</child1>
	<child2>child2</child2>
	<child3>child3</child3>
</parent>

XSLT
Code:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="parent">Test<xsl:apply-templates/></xsl:template>
<xsl:template match="child1">1</xsl:template>
<xsl:template match="child2">2</xsl:template>
<xsl:template match="child3">3</xsl:template>

</xsl:stylesheet>


Java
Code:
package org.bundeswehr.transform;

import java.io.File;
import java.io.FileOutputStream;

import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;

import org.w3c.dom.Document;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

public class SimpleTransform {
	
	static boolean valid = true;
	
	public static void main(String[] args) throws Exception{
		
		
		
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

		DocumentBuilder parser = factory.newDocumentBuilder();
		
		Document document = parser.parse("test.xml");
		
		TransformerFactory factoryT = TransformerFactory.newInstance();
		Transformer transformer = factoryT.newTransformer(new StreamSource(new File("test.xslt")));
		
			transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("test.txt")));
		
		
	}
}


MFG

zEriX
 
Das ist der Inhalt der txt.
Code:
<?xml version="1.0" encoding="UTF-8"?>Test
	1
	2
	3

Das
Code:
<?xml version="1.0" encoding="UTF-8"?>
ist klar. Der xsl:output ist hier standardmäßig auf xml eingestellt, wenn man das umstellt auf Text kommt das nicht mehr.

Code:
<xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/>
 
Hallo,

danke für deine Antwort. Ich verstehe das jetzt irgendwie nicht. Ich habe den Code von dir übernommen. Aber es wird weiterhin nur geparsed und nicht transformiert Irgendwo ist bei mir der Wurm drinn ...

Transformator.java

Code:
import java.io.File;
import java.io.FileOutputStream;

import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;

import org.w3c.dom.Document;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

public class Transformator {
	
	static boolean valid = true;
	
	public static void main(String[] args) throws Exception{
		
		
		
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		factory.setValidating(true);
		DocumentBuilder parser = factory.newDocumentBuilder();
		parser.setErrorHandler(new ErrorHandler(){

			public void error(SAXParseException arg0) throws SAXException {
				valid = false;
			}

			public void fatalError(SAXParseException arg0) throws SAXException {
				valid = false;
			}

			public void warning(SAXParseException arg0) throws SAXException {
				valid = false;
			}
			
		});
		Document document = parser.parse("source.xml");
		
		TransformerFactory factoryT = TransformerFactory.newInstance();
		Transformer transformer = factoryT.newTransformer();
		if(valid)
			transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("destination.c")));
		
		else
			System.out.println("Not valid");
	}
}

source.xml

Code:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>

<!DOCTYPE parent SYSTEM "type.dtd">

<parent>
	<child1>child1</child1>
	<child2>child2</child2>
	<child3>child3</child3>
</parent>

transform.xsl

Code:
<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="parent">Test<xsl:apply-templates/></xsl:template>
<xsl:template match="child1">1</xsl:template>
<xsl:template match="child2">2</xsl:template>
<xsl:template match="child3">3</xsl:template>

</xsl:stylesheet>

type.dtd

Code:
<!ELEMENT parent (child1, child2, child3)>
<!ELEMENT child1 (#PCDATA)>
<!ELEMENT child2 (#PCDATA)>
<!ELEMENT child3 (#PCDATA)>

destination.c

Code:
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="transform.xsl"?>
<parent>
	<child1>child1</child1>
	<child2>child2</child2>
	<child3>child3</child3>
</parent>

Weisst du wo bei mir der Fehler liegt ? Muss ich vielleicht sonst noch irgendwas beachten ?

Gruß

Tikonteroga
 
Guten Morgen,

den Fehler den du hast liegt an dem Java-Quell-Code. Ich hatte was probiert und es nicht mehr rückgängig gemacht, als ich den Code gepostet hab. :-(

Die Zeile ist nicht ganz korrekt
Code:
Transformer transformer = factoryT.newTransformer();

Die muss lauten
Code:
Transformer transformer = factoryT.newTransformer(new StreamSource(new File(deine XSL-File)));


MFG

zEriX
 
Guten Morgen,

es hat jetzt endlich geklappt :) Vielen Dank für deine Unterstützung. Ich werde mir jetzt mal die ganzen Klassen und Methoden anschauen und dann mal versuchen das Programm mit Klassndiagrammen zu modellieren.

Gruß

Tikonteroga
 
Hallo,

ich habe nochmal eine Frage zur Problemstellung. In den Code-Beispielen muss das XML Schema dem Parser explizit angegeben werden, damit dieser nach dem XML Schema validiert. Die Document Type Definition wird jedoch automatisch erkannt.

Gibt es denn eine Möglichkeit ein XML Dokument darauf zu überprüfen, ob die Syntax in einer DTD oder in einer XSD beschrieben ist ?

Gruß

Tikonteroga
 
Hallo,

hier ist ein Beispiel wie man eine XML-Datei validiert mit einem intern angegebenen Schema.

Code:
import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

/**
 * @author user04
 *
 */
public class SimpleDom {

	/**
	 * @param args
	 * @throws Exception 
	 */
	static final String JAXP_SCHEMA_LANGUAGE =
	    "http://java.sun.com/xml/jaxp/properties/schemaLanguage";

	static final String W3C_XML_SCHEMA =
	    "http://www.w3.org/2001/XMLSchema"; 
	
	public static void main(String[] args) throws Exception {
		
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		factory.setNamespaceAware(true);
		factory.setValidating(true);
		  
		try {
		  factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
		} 
		catch (IllegalArgumentException x) {
		  
		} 

		DocumentBuilder parser = factory.newDocumentBuilder();


		parser.setErrorHandler(new ErrorHandler(){

			public void error(SAXParseException arg0) throws SAXException {
				System.out.println(arg0);
				
			}

			public void fatalError(SAXParseException arg0) throws SAXException {
				System.out.println(arg0);
			}

			public void warning(SAXParseException arg0) throws SAXException {
				System.out.println(arg0);
				
			}
			
		});
		Document document=parser.parse(new File("test.xml"));
		
	}


Hier noch eine andere Möglichkeit mit externem Schema-File

Code:
import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

/**
 * @author user04
 *
 */
public class SimpleDom {

	/**
	 * @param args
	 * @throws Exception 
	 */
	static final String JAXP_SCHEMA_LANGUAGE =
	    "http://java.sun.com/xml/jaxp/properties/schemaLanguage";

	
	public static void main(String[] args) throws Exception {
		
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		factory.setNamespaceAware(true);
		factory.setValidating(true);
		  
		try {
		  factory.setAttribute(JAXP_SCHEMA_LANGUAGE, new File("test.xsd"));
		} 
		catch (IllegalArgumentException x) {
		  
		} 

		DocumentBuilder parser = factory.newDocumentBuilder();


		parser.setErrorHandler(new ErrorHandler(){

			public void error(SAXParseException arg0) throws SAXException {
				System.out.println(arg0);
				
			}

			public void fatalError(SAXParseException arg0) throws SAXException {
				System.out.println(arg0);
			}

			public void warning(SAXParseException arg0) throws SAXException {
				System.out.println(arg0);
				
			}
			
		});
		Document document=parser.parse(new File("test.xml"));
		
	}


MFG

zEriX
 
Zuletzt bearbeitet:
Zurück