Discussion:
XML/XSL und VB.net
(zu alt für eine Antwort)
Jörg Klebsattel
2007-12-30 18:01:13 UTC
Permalink
Hallo NG,

ich habe mit dem XMLWriter unter VB.net einen Dataset in eine XML-Datei
geschrieben. Die XSL-Datei habe ich auch schon bereits geschrieben. Nach
einigen Modifikationen an der XML-Datei hat es dann geklappt, dass ich
die XML-Datei im Browser mit Stylsheets anschauen konnte.

/<?xml-stylesheet type="text/xsl" href="myxslfile.xsl"?> /Musste ich
manuell mit Hand einfügen. Jetzt meine Frage: Ist es möglich, diese
Zeile und noch evtl. anderen Änderungen vom Programm aus, das die
XML-Datei erzeugt irgendwie einzufügen. Wie könnte da der VB.net-Code
aussehen?

Noch eine Frage zu XSL:
Wie kann ich Schriftart, Größe und sonstige Formatierungen an Schrift
und Tabelle vornehmen? Wie füge ich z. B. das aktuelle Datum ein bzw.
Bilder?

Ich hoffe, dass ihr mir weiterhelfen könnt.

Viele Grüße und schonmal einen guten Rutsch
Jörg Klebsattel

joerg(a)klebsattel.de
Samaschke, Karsten
2007-12-31 07:10:26 UTC
Permalink
Post by Jörg Klebsattel
/<?xml-stylesheet type="text/xsl" href="myxslfile.xsl"?> /Musste ich
manuell mit Hand einfügen. Jetzt meine Frage: Ist es möglich, diese
Zeile und noch evtl. anderen Änderungen vom Programm aus, das die
XML-Datei erzeugt irgendwie einzufügen. Wie könnte da der VB.net-Code
aussehen?
Du meinst sicherlich

<XmlDocument>.CreateProcessingInstruction()

als Funktionalität? Die Vorgehensweise sollte diese sein: Lade das
generierte XML-Dokument in eine XmlDocument-Instanz herein, erzeuge die
PI, füge den generierten Knoten an der gewünschten Stelle ein und lasse
Dir den XML-Quelltext zurück geben.
Post by Jörg Klebsattel
Wie kann ich Schriftart, Größe und sonstige Formatierungen an Schrift
und Tabelle vornehmen? Wie füge ich z. B. das aktuelle Datum ein bzw.
Bilder?
Wohin transformierst Du denn? HTML? FO?

Mit freundlichen Gruessen / Best regards,

Karsten Samaschke
--
IT-Consulting, IT-Development, IT-Training
Homepage: http://www.ksamaschke.de
Blog: http://www.karsan.de
Family: http://www.familyblogger.de
Smartphone-Blogger: http://smart.karsan.de

Sent via MacBook / Windows Vista
Jörg Klebsattel
2007-12-31 09:29:02 UTC
Permalink
Post by Samaschke, Karsten
Du meinst sicherlich
<XmlDocument>.CreateProcessingInstruction()
als Funktionalität? Die Vorgehensweise sollte diese sein: Lade das
generierte XML-Dokument in eine XmlDocument-Instanz herein, erzeuge
die PI, füge den generierten Knoten an der gewünschten Stelle ein und
lasse Dir den XML-Quelltext zurück geben.
Gibts dafür ein Codebeispiel?
Post by Samaschke, Karsten
Wohin transformierst Du denn? HTML? FO?
Also ich öffne die XML-Datei immer im Browser, überlege mir aber gerade,
ob ich dann nicht hergehen soll und die XML und XSL Datei in eine
HTML-Datei zu transformieren.

Grüße
Jörg Klebsattel
Jörg Klebsattel
2007-12-31 11:16:22 UTC
Permalink
Also, ich habe jetzt mal folgenden code:

mydataset.WriteXml("c:/.../data.xml")
' Create a procesing instruction.
Dim newPI As XmlProcessingInstruction
Dim PItext As String = "type='text/xsl' href='data.xsl'"
newPI = doc.CreateProcessingInstruction("xml-stylesheet", PItext)

' Display the target and data information.
Console.WriteLine("<?{0} {1}?>", newPI.Target, newPI.Data)

' Add the processing instruction node to the document.
doc.AppendChild(newPI)rüße

Aber irgendwie funktioniert das nicht. Was mache ich falsch?
Kann ich auch die zweite und letzte Zeilen in der XML-Datei löschen?

Grüße
Jörg Klebsattel
Martin Honnen
2008-01-02 13:21:51 UTC
Permalink
Post by Jörg Klebsattel
mydataset.WriteXml("c:/.../data.xml")
' Create a procesing instruction.
Dim newPI As XmlProcessingInstruction
Dim PItext As String = "type='text/xsl' href='data.xsl'"
newPI = doc.CreateProcessingInstruction("xml-stylesheet", PItext)
' Display the target and data information.
Console.WriteLine("<?{0} {1}?>", newPI.Target, newPI.Data)
' Add the processing instruction node to the document.
doc.AppendChild(newPI)rüße
Aber irgendwie funktioniert das nicht. Was mache ich falsch?
Kann ich auch die zweite und letzte Zeilen in der XML-Datei löschen?
System.Xml.XmlDocument modelliert nicht "Zeilen" in einem XML-Dokument,
sondern Knoten. Knoten können gelöscht werden:
node.ParentNode.RemoveChild(node)

Was das Einfügen einer "processing instruction" angeht, so gehört
<?xml-stylesheet?> an den Anfang des XML-Dokumentes, vor das
Wurzelelement. Das erreicht man per

Dim doc As New XmlDocument()
doc.Load("data.xml")
Dim pi = doc.CreateProcessingInstruction("xml-stylesheet",
"type='text/xsl' href='data.xsl'")
doc.InsertBefore(pi, doc.DocumentElement)
doc.Save("data.xml")

Wenn du Dinge wie das aktuelle Datum in das Ergebnis einer
XSLT-Transformation einfügen willst, dann definiere in deinem
XSLT-Stylesheet einen Parameter, also etwa
<xsl:param name="current-date"/>
und führe die Transformation per System.Xml.Xsl.XslCompiledTransform
aus, dabei kannst du an die Transform-Methode eine XsltArgumentList
übergeben und so z.B. das Datum als Parameter setzen.
--
Martin Honnen --- MVP XML
http://JavaScript.FAQTs.com/
Jörg Klebsattel
2008-01-04 14:10:17 UTC
Permalink
Post by Martin Honnen
Dim doc As New XmlDocument()
doc.Load("data.xml")
Dim pi = doc.CreateProcessingInstruction("xml-stylesheet",
"type='text/xsl' href='data.xsl'")
doc.InsertBefore(pi, doc.DocumentElement)
doc.Save("data.xml")
Hallo,

der obige Code funktioniert soweit ganz gut. Nur ist es irgendwie
möglich einzelne Zeilen, nachdem die XML-Datei erstellt wurde zu löschen
bzw. zu ändern?

Grüße
Jörg Klebsattel
Martin Honnen
2008-01-04 15:05:15 UTC
Permalink
Post by Jörg Klebsattel
Nur ist es irgendwie
möglich einzelne Zeilen, nachdem die XML-Datei erstellt wurde zu löschen
bzw. zu ändern?
Wie gesagt, das DOM-Modell, das System.Xml.XmlDocument bietet, arbeitet
nicht mit "Zeilen", sondern mit "Knoten". Es gibt in einem XML-Dokument
verschiedene Knoten, Elementknoten, Attributknoten, Kommentarknoten,
Textknoten. Diese lassen sich auch ändern oder löschen.
Mit folgendem XML-Dokument
<root>
<foo>foo</foo>
<bar>bar</bar>
</root>
löscht folgender VB-Code alle foo-Kindselemente des root-Elementes:

Dim fileName As String = "XMLFile1.xml"
Dim doc As XmlDocument = New XmlDocument()
doc.Load(fileName)
Dim fooList As XmlNodeList = doc.SelectNodes("root/foo")
For i As Integer = fooList.Count - 1 To 0 Step -1
Dim foo As XmlNode = fooList(i)
foo.ParentNode.RemoveChild(foo)
Next
doc.Save(fileName)

Siehe auch
<URL:http://msdn2.microsoft.com/de-de/library/t058x2df(VS.80).aspx>
--
Martin Honnen --- MVP XML
http://JavaScript.FAQTs.com/
Jörg Klebsattel
2008-01-04 15:36:58 UTC
Permalink
Post by Martin Honnen
<root>
<foo>foo</foo>
<bar>bar</bar>
</root>
Dim fileName As String = "XMLFile1.xml"
Dim doc As XmlDocument = New XmlDocument()
doc.Load(fileName)
Dim fooList As XmlNodeList = doc.SelectNodes("root/foo")
For i As Integer = fooList.Count - 1 To 0 Step -1
Dim foo As XmlNode = fooList(i)
foo.ParentNode.RemoveChild(foo)
Next
doc.Save(fileName)
Mein XML-Dokument sieht so aus:
<autorendataset xmlns="http://tempuri.org/einsatzDataSet.xsd">
<autor>autor</autor>
<buch>buch>/buch>
</autorendataset>

Ich will eigentlich nur, dass

/*xmlns="http://tempuri.org/einsatzDataSet.xsd" */

aus diesem XML-Dokument "verschwindet", denn so funktioniert es mit
meiner XSL-Datei nicht. Das ganz funktioniert nur, wenn ich den
xmlns-Part von Hand lösche, ich möchte das ganze aber irgendwie per
vb.net automatisch erledigen. Die XML-Datei muss später nicht mehr in
den Dataset gelesen werden, sie dient nur als eine art Berichtersatz.
Jörg Klebsattel
2008-01-04 15:41:30 UTC
Permalink
Post by Martin Honnen
<root>
<foo>foo</foo>
<bar>bar</bar>
</root>
Dim fileName As String = "XMLFile1.xml"
Dim doc As XmlDocument = New XmlDocument()
doc.Load(fileName)
Dim fooList As XmlNodeList = doc.SelectNodes("root/foo")
For i As Integer = fooList.Count - 1 To 0 Step -1
Dim foo As XmlNode = fooList(i)
foo.ParentNode.RemoveChild(foo)
Next
doc.Save(fileName)
Siehe auch
<URL:http://msdn2.microsoft.com/de-de/library/t058x2df(VS.80).aspx>
Mein XML-Dokument sieht so aus:
<autorendataset xmlns="http://tempuri.org/autorendataset.xsd">
<autor>autor</autor>
<buch>buch>/buch>
</autorendataset>

Ich will eigentlich nur, dass

/*xmlns="http://tempuri.org/autorendataset.xsd" */

aus diesem XML-Dokument "verschwindet", denn so funktioniert es mit
meiner XSL-Datei nicht. Das ganz funktioniert nur, wenn ich den
xmlns-Part von Hand lösche, ich möchte das ganze aber irgendwie per
vb.net automatisch erledigen. Die XML-Datei muss später nicht mehr in
den Dataset gelesen werden, sie dient nur als eine art Berichtersatz.
Martin Honnen
2008-01-04 16:03:38 UTC
Permalink
Post by Jörg Klebsattel
<autorendataset xmlns="http://tempuri.org/autorendataset.xsd">
<autor>autor</autor>
<buch>buch>/buch>
</autorendataset>
Ich will eigentlich nur, dass
/*xmlns="http://tempuri.org/autorendataset.xsd" */
aus diesem XML-Dokument "verschwindet", denn so funktioniert es mit
meiner XSL-Datei nicht. Das ganz funktioniert nur, wenn ich den
xmlns-Part von Hand lösche, ich möchte das ganze aber irgendwie per
vb.net automatisch erledigen.
Das ist der komplett falsche Ansatz, du musst halt das XSLT-Stylesheet
so erstellen, dass es mit dem Namensraum arbeitet. Das ist einfach, z.b.
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ad="http://tempuri.org/autorendataset.xsd"
version="1.0">
dann muss man den Präfix "ad" in XPath-Ausdrücken und Matchmustern
verwenden, also etwa
<xsl:value-of select="/ad:autorendataset/ad:autor"/>
Wenn du weitere Fragen zu XSLT hast, dann besser in
microsoft.public.de.german.xml. Followup-to ist gesetzt.
--
Martin Honnen --- MVP XML
http://JavaScript.FAQTs.com/
Loading...