ThomasM: XML mit XSLT komplett nach HTML transformieren?

Beitrag lesen

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