¿Cómo imprimo bastante un documento de resultados XSLT con elementos de origen eliminados?

Tengo un documento fuente XHTML con elementos en varios espacios de nombres que estoy transformando en un documento HTML (obviamente sin espacios de nombres). En mis plantillas XSL, solo comparo elementos en el espacio de nombres XHTML para eliminar elementos no compatibles con HTML del árbol de resultados. Sin embargo, en la salida, mientras esos elementos desaparecen, el espacio en blanco que utilicé para sangrarlos permanece, es decir, líneas de CR / LFs irrelevantes y tabs.

Por ejemplo, si esta es mi entrada:

Después de aplicar la transformación, este será el resultado:

 

Si bien mi resultado deseado es este:

 

Esto sucede usando TransforMiiX (adjuntando la hoja de estilo localmente en Firefox) y libxslt (adjuntando la hoja de estilo del servidor con PHP), así que sé que es probablemente el resultado de que algún parámetro XSL no se haya establecido, pero he intentado jugar con , xml:space="default|preserve" , , todo en vano.

Esto se implementará en el lado del servidor, así que si no hay forma de hacerlo en XSL sin procesar, pero hay una manera de hacerlo en PHP, lo aceptaré.

Sé que esto no es un problema de espacio de nombres ya que obtengo el mismo resultado si elimino CUALQUIER elemento.

El espacio en blanco que ve es del documento de origen. Las reglas predeterminadas de XSLT dicen que los nodos de texto deben copiarse, no importa si están vacíos o no. Para anular la regla predeterminada, incluya:

  

Alternativamente: Localice cualquier (o ) y especifique explícitamente a qué niños desea aplicar plantillas. Este método puede ser necesario si su transformación se basa en parte en la plantilla de identidad (en cuyo caso, la plantilla vacía para los nodos de texto sería contraproducente).

He marcado el espacio en blanco “insignificante” en su fragmento de la forma en que Word lo haría:

 
¶ ····¶ ········¶ ············¶ ········¶ ····

EDITAR: También puede modificar su plantilla de identidad de esta manera:

       

Esto eliminaría cualquier nodo de texto en blanco (los valores de los atributos permanecen intactos, no son nodos de texto). Use para imprimir bastante el resultado.

Tiene dos maneras de lograr el resultado deseado: o bien repara su transformación original para manejar espacios en blanco de forma diferente, o mantiene su transformación tal como está y agrega una segunda pasada para embellecer la salida. Si su transformación original es complicada, entonces recomendaría el enfoque de 2 pasos. No desea hacer su transformación aún más complicada o creará algunos casos de esquina donde no obtenga los resultados deseados y tendrá que agregar más manejo de casos especiales y potencialmente agregar errores a algo que solía funcionar , etc …

Debería poder ignorar los nodos de espacio en blanco probándolos con normalize-text() . Así es como podría ser el segundo pase. Si optas por el método de 1 pase, supongo que el código será más o menos el mismo.