Wie kann ich diese redundanten Namespaces aus einem XSLT-Stylesheet verhindern?

Wenn ich ein XSLT-Stylesheet verwende, um eine XML-Datei, die eingebettetes XHTML (mit Namespaces) enthält, in reines XHTML zu transformieren, bleiben mir redundante Namespacedefinitionen für die Elemente, die ursprünglich XHTML waren. Einfacher Testfall:

XML:

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xml" href="fbb.xsl"?>
<foo xmlns="urn:foo:bar:baz" xmlns:html="http://www.w3.org/1999/xhtml">
    <bar>
        <baz>Some <html:i>example</html:i> text.</baz>
    </bar>
</foo>

XSL:

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:fbb="urn:foo:bar:baz" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="fbb">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/fbb:foo">
        <html>
            <head>
                <title>Example</title>
            </head>

            <body>
                <p>
                    <xsl:copy-of select="fbb:bar/fbb:baz/node()"/>
                </p>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Ausgabe:

<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Example</title>
  </head>
  <body>
    <p>Some <html:i xmlns="urn:foo:bar:baz" xmlns:html="http://www.w3.org/1999/xhtml">example</html:i> text.</p>
  </body>
</html>

Kann verhindert werden, dass die redundanten Namespaces (und präfixen) dem <i> element? (For reference, I'm using -Element hinzugefügt werden? (Als Referenz verwende ich xsltproc with mit libxml2-2.7.3 and und libxslt-1.1.24 on Cygwin.) auf Cygwin.)

Antwort auf "Wie kann ich diese redundanten Namespaces aus einem XSLT-Stylesheet verhindern? " 2 von antworten

Aktualisieren Sie Ihr exclude-result-prefixes to include the default namespace: auf den Standard-Namespace:

exclude-result-prefixes="#default"

Oder Sie könnten alle Inline-Namensabstände unterdrücken, indem Sie:

exclude-result-prefixes="#all"

Es gibt jedoch ein bisschen Wonkiness, da einige Prozessoren eine leerstehende Liste erwarten, während andere eine durch Kommas getrennte Liste erwarten. xsltproc scheint durch Kommas getrennt zu sein, also wenn Sie noch explizit sein möchten, können Sie dies tun:

exclude-result-prefixes="#default,fbb"

Anstelle von xsl:copy-of use an identity transformation templates and remove the namespace prefix from XHTML elements. verwenden Sie eine Identitätstransformationsvorlage und entfernen Sie das Namespacepräfix aus XHTML-Elementen.

<xsl:stylesheet version="1.0"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:fbb="urn:foo:bar:baz"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:html="http://www.w3.org/1999/xhtml"
                exclude-result-prefixes="fbb html">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/fbb:foo">
    <html>
      <head>
        <title>Example</title>
      </head>
      <body>
        <p>
          <xsl:apply-templates select="fbb:bar/fbb:baz/node()"/>
        </p>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="html:*">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>