2009-05-06 18 views
5

Cuando uso una hoja de estilos XSLT para transformar un archivo XML que contiene XHTML incrustado (usando espacios de nombres) en XHTML puro, me quedan definiciones de espacio de nombres redundantes en los elementos que originalmente eran XHTML. caso de prueba sencilla:¿Cómo puedo evitar estos espacios de nombres redundantes de una hoja de estilos XSLT?

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> 

Salida:

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

¿Es posible evitar que los espacios de nombres redundantes (y prefijo) se agreguen al elemento <i>? (Como referencia, estoy usando xsltproc con libxml2-2.7.3 y libxslt-1.1.24 en Cygwin.)

Respuesta

8

En lugar de utilizar un xsl:copy-of de identidad plantillas de transformación y quitar el prefijo de espacio de nombres de elementos XHTML.

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

Modificar una exclude-result-prefixes para incluir el espacio de nombres por defecto:

exclude-result-prefixes="#default" 

O bien, podría suprimir todos los espacios de nombre en línea haciendo:

exclude-result-prefixes="#all" 

Sin embargo, hay un poco de ganas, ya que algunos procesadores esperan una lista separada por espacios, mientras que otros esperan una lista separada por comas. xsltproc parece que le gusta separados por comas-así que si todavía quiere ser explícita que puede hacer:

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

Hmm ... mi copia de xsltproc en realidad da un error de "espacio de nombre indefinido" para las listas separadas por comas. Una lista separada por espacios que incluye "#default" no parece cambiar su comportamiento, e incluir "#all" nuevamente produce "espacio de nombre indefinido". –

+5

libxslt solo es compatible con XSLT 1.0 y #default y #todos son XSLT 2.0. – jelovirt

Cuestiones relacionadas