Robert B.: XML mit XSLT komplett nach HTML transformieren?

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:

  • vollständiger Knoten-Name bestehend aus (optional Namensraum-Alias, : und) Element-Name,
  • vollständiger Attributname mit (optionalem Namensraum-Alias und :)
  • Namesraum-URIs
  • Attribut-Werte
  • Knoten-Inhalte

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=&quot;</xsl:text>
    <xsl:value-of select="@xmlns"/>
    <xsl:text>&quot;</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

akzeptierte Antworten

  1. 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), '=', '&quot;', $ns, '&quot;'))"/>
    
        <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('&lt;?', name(), ' ', ., '?&gt;')"/></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>&lt;?mypi "piwert"?&gt;</p>
    

    Hier also alle vorkommenden individuellen Namespaces sowie die PIs.

    Ansonsten gibt es noch die Funktion namespace-uri().

    Grüße,
    Thomas

    1. 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), '=', '&quot;', $ns, '&quot;'))"/>
      
          <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('&lt;?', name(), ' ', ., '?&gt;')"/></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

      1. 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

        --
        Was ist eine Signatur?