XML mit XSLT komplett nach HTML transformieren?
Robert B.
- html
- xml
- xsl
Hallo Forum,
zur Dokumentation von XML-Dateien inklusive hervorgehobener Syntax bastele ich gerade an einer XSLT, die eine XML-Eingabe nach HTML transformiert. Für das Syntax-Highlighting relevante Bestandteile erhalte ich mit XSL und XPath relativ einfach:
:
und) Element-Name,:
)Die XML-Processing-Instructions fehlen bislang, weil die mit XSL nicht zugänglich sind, wie mir scheint, aber das könnte man auch schnell selbst mit einem Texteditor nachtragen.
Spannenderweise habe ich auch keinen Zugriff auf die XML-Namensraum-Deklarationen, diese Attribute scheinen für XSLT nicht zu existieren, die entsprechende Abfrage läuft ins Leere:
<xsl:if test="@xmlns">
<xsl:text>xmlns="</xsl:text>
<xsl:value-of select="@xmlns"/>
<xsl:text>"</xsl:text>
</xsl:if>
Hat jemand eine Idee, ob das mit XSLT machbar ist? Mit einem XML-Parser und etwas Prozessierung der ersten Zeile(n) ist das nicht so schwierig.
Vielen Dank und viele Grüße
Robert
Hallo Robert,
Die XML-Processing-Instructions fehlen bislang, weil die mit XSL nicht zugänglich sind, wie mir scheint, aber das könnte man auch schnell selbst mit einem Texteditor nachtragen.
Spannenderweise habe ich auch keinen Zugriff auf die XML-Namensraum-Deklarationen, diese Attribute scheinen für XSLT nicht zu existieren, die entsprechende Abfrage läuft ins Leere:
Vielleicht hilft dieser Ansatz weiter.
Von diesem XML ausgehend:
<?xml version="1.0" encoding="UTF-8"?>
<wurzel xmlns:a="uri_a" xmlns:b="uri_b">
<a:test1>inhalt</a:test1>
<b:test2>inhalt</b:test2>
<?mypi "piwert"?>
</wurzel>
liefert dieses XSLT-2.0-Stylesheet:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="namespaces" select="//namespace::*"/>
<xsl:variable name="ns_name_value" select="distinct-values(for $ns in $namespaces
return concat('xmlns', ':', name($ns), '=', '"', $ns, '"'))"/>
<xsl:for-each select="$ns_name_value">
<p><xsl:value-of select="."/></p>
</xsl:for-each>
<xsl:for-each select="//processing-instruction()">
<p><xsl:value-of select="concat('<?', name(), ' ', ., '?>')"/></p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
als Ausgabe:
<p>xmlns:a="uri_a"</p>
<p>xmlns:b="uri_b"</p>
<p>xmlns:xml="http://www.w3.org/XML/1998/namespace"</p>
<p><?mypi "piwert"?></p>
Hier also alle vorkommenden individuellen Namespaces sowie die PIs.
Ansonsten gibt es noch die Funktion namespace-uri()
.
Grüße,
Thomas
Moin Thomas,
Vielleicht hilft dieser Ansatz weiter.
definitiv, vielen Dank!
Von diesem XML ausgehend:
<?xml version="1.0" encoding="UTF-8"?> <wurzel xmlns:a="uri_a" xmlns:b="uri_b"> <a:test1>inhalt</a:test1> <b:test2>inhalt</b:test2> <?mypi "piwert"?> </wurzel>
liefert dieses XSLT-2.0-Stylesheet:
Ich habe die Version hervorgehoben, denn nicht nur das bislang von mir verwendete xsltproc
, sondern auch unser Wiki versteht nur XSLT 1.0.
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:variable name="namespaces" select="//namespace::*"/> <xsl:variable name="ns_name_value" select="distinct-values(for $ns in $namespaces return concat('xmlns', ':', name($ns), '=', '"', $ns, '"'))"/> <xsl:for-each select="$ns_name_value"> <p><xsl:value-of select="."/></p> </xsl:for-each> <xsl:for-each select="//processing-instruction()"> <p><xsl:value-of select="concat('<?', name(), ' ', ., '?>')"/></p> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Und genau das ↑ werde ich mir übers Wochenende noch einmal genauer anschauen, verstehen und das Wiki aktualisieren.
Viele Grüße
Robert
Guten Morgen,
Und genau das ↑ werde ich mir übers Wochenende noch einmal genauer anschauen, verstehen und das Wiki aktualisieren.
Vielen Dank!
Ich hätte gestern Abend behauptet, dass das eine Textübernahme aus der Doku 8.1.2 sei, fand in der Versionsgeschichte der XML-Seite aber einen Benutzer:Donut, der 2011 aktiv war.
Auf jeden Fall müsste das alles mal gesichtet und ggfalls sortiert und aktualisiert werden.
Wenn Du einen Abschnitt == Referenzen ==
anlegst, könntest du bitte bei nichtkategorisierten Seiten ein [[Kategorie:XML]]
hinzufügen?
Evtl. auch eine Vorlage:Text-Info?
z.B:
{{Text-Info|
Dauer=30min|
Level=schwierig|
Vorwissen=Grundkenntnisse in
* [[XML]]
* nochwas
}}
Vielen Dank!
Herzliche Grüße
Matthias Scharwies