5 Stimmen

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

Wenn ich ein XSLT-Stylesheet verwende, um eine XML-Datei, die eingebettetes XHTML (unter Verwendung von Namespaces) enthält, in reines XHTML umzuwandeln, bleiben mir redundante Namespace-Definitionen 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>

Sortie :

<?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>

Ist es möglich zu verhindern, dass die redundanten Namensräume (und Präfixe) zur <i> Element? (Zur Information, ich verwende xsltproc avec libxml2-2.7.3 y libxslt-1.1.24 unter Cygwin).

8voto

jelovirt Punkte 5744

Anstelle von xsl:copy-of eine Identitätsumwandlungsvorlage verwenden und das Namespace-Präfix aus XHTML-Elementen entfernen.

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

4voto

johnvey Punkte 5004

Aktualisieren Sie Ihr exclude-result-prefixes um den Standard-Namensraum einzubeziehen:

exclude-result-prefixes="#default"

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

exclude-result-prefixes="#all"

Es gibt jedoch ein paar Ungereimtheiten, da einige Prozessoren eine durch Leerzeichen getrennte Liste erwarten, während andere eine durch Komma getrennte Liste erwarten. xsltproc scheint die durch Komma getrennte Liste zu bevorzugen, wenn Sie also immer noch explizit sein wollen, können Sie das tun:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X